// Parse the supplied command-line arguments from a mount(8) invocation on OS X // or Linux. func parseArgs( args []string) ( device string, mountPoint string, opts map[string]string, err error) { opts = make(map[string]string) // Process each argument in turn. positionalCount := 0 for i, s := range args { switch { // Skip the program name. case i == 0: continue // "-o" is illegal only when at the end. We handle its argument in the case // below. case s == "-o": if i == len(args)-1 { err = fmt.Errorf("Unexpected -o at end of args.") return } // Is this an options string following a "-o"? case i > 0 && args[i-1] == "-o": err = mount.ParseOptions(opts, s) if err != nil { err = fmt.Errorf("ParseOptions(%q): %v", s, err) return } // Is this the device? case positionalCount == 0: device = s positionalCount++ // Is this the mount point? case positionalCount == 1: mountPoint = s positionalCount++ default: err = fmt.Errorf("Unexpected arg %d: %q", i, s) return } } return }
// Add the flags accepted by run to the supplied flag set, returning the // variables into which the flags will parse. func populateFlags(c *cli.Context) (flags *flagStorage) { flags = &flagStorage{ // File system MountOptions: make(map[string]string), DirMode: os.FileMode(c.Int("dir-mode")), FileMode: os.FileMode(c.Int("file-mode")), Uid: int64(c.Int("uid")), Gid: int64(c.Int("gid")), // GCS, KeyFile: c.String("key-file"), EgressBandwidthLimitBytesPerSecond: c.Float64("limit-bytes-per-sec"), OpRateLimitHz: c.Float64("limit-ops-per-sec"), // Tuning, StatCacheTTL: c.Duration("stat-cache-ttl"), TypeCacheTTL: c.Duration("type-cache-ttl"), GCSChunkSize: uint64(c.Int("gcs-chunk-size")), TempDir: c.String("temp-dir"), TempDirLimit: int64(c.Int("temp-dir-bytes")), ImplicitDirs: c.Bool("implicit-dirs"), // Debugging, DebugCPUProfile: c.Bool("debug_cpu_profile"), DebugFuse: c.Bool("debug_fuse"), DebugGCS: c.Bool("debug_gcs"), DebugHTTP: c.Bool("debug_http"), DebugInvariants: c.Bool("debug_invariants"), DebugMemProfile: c.Bool("debug_mem_profile"), } // Handle the repeated "-o" flag. for _, o := range c.StringSlice("o") { mountpkg.ParseOptions(flags.MountOptions, o) } return }