* Added command line switch to specify FQDN.
authorUrban Wallasch <urban.wallasch@freenet.de>
Thu, 4 Apr 2019 16:45:46 +0000 (18:45 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Thu, 4 Apr 2019 16:45:46 +0000 (18:45 +0200)
* Display file sizes in human readable units.

gogopherd.go

index 14feca4469fbe8341be5efaff945a8ebd72b37be..1523026b9a67e37df9683af3b114687ea44acf27 100644 (file)
@@ -55,6 +55,7 @@ var cfg = struct {
 func initialize() {
        flag.StringVar(&cfg.iface, "i", cfg.iface, "interface to bind to")
        flag.StringVar(&cfg.port, "p", cfg.port, "TCP port to listen on")
+       flag.StringVar(&cfg.fqdn, "f", cfg.port, "fully qualified domain name")
        flag.StringVar(&cfg.docRoot, "d", cfg.docRoot, "document root directory")
        flag.StringVar(&cfg.header, "H", cfg.header, "index header")
        flag.BoolVar(&cfg.verbose, "v", cfg.verbose, "produce verbose output")
@@ -80,6 +81,7 @@ func initialize() {
        tracer.Print("interface: ", cfg.iface)
        tracer.Print("TCP port:  ", cfg.port)
        tracer.Print("doc root:  ", cfg.docRoot)
+       tracer.Print("fqdn:      ", cfg.fqdn)
        tracer.Print("header:    ", cfg.header)
        tracer.Print("verbose:   ", cfg.verbose)
 }
@@ -154,6 +156,20 @@ func guessFiletype(path string) (string, error) {
        return gopherType, nil
 }
 
+func humanSize(bytes int64) string {
+       var units = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"}
+       ui := 0
+       decimals := 1
+       if bytes < 1024 {
+               decimals = 0
+       }
+       var n float64
+       for n = float64(bytes); n > 1024; n /= 1024 {
+               ui = ui + 1
+       }
+       return fmt.Sprintf("%.*f %s", decimals, n, units[ui])
+}
+
 func createIndex(selector string) (string, error) {
        dirname := cfg.docRoot + selector
        d, err := os.Open(dirname)
@@ -177,7 +193,7 @@ func createIndex(selector string) (string, error) {
                } else if fmode.IsRegular() {
                        // create a file reference
                        ftype, _ := guessFiletype(dirname + pathSep + fi.Name())
-                       list += ftype + fi.Name() + " (" + strconv.FormatInt(fi.Size(), 10) + ")\t" + selector + pathSep + fi.Name() + loc
+                       list += ftype + fi.Name() + " (" + humanSize(fi.Size()) + ")\t" + selector + pathSep + fi.Name() + loc
                } else if fmode&os.ModeSymlink != 0 {
                        // create a reference according to link target
                        linktarget, _ := os.Readlink(dirname + pathSep + fi.Name())