func start() *libfs.Error { kbfsParams := libkbfs.AddFlags(flag.CommandLine) platformParams := libfuse.AddPlatformFlags(flag.CommandLine) flag.Parse() if *version { fmt.Printf("%s\n", libkbfs.VersionString()) return nil } if len(flag.Args()) < 1 { fmt.Print(getUsageStr()) return libfs.InitError("no mount specified") } if len(flag.Args()) > 1 { fmt.Print(getUsageStr()) return libfs.InitError("extra arguments specified (flags go before the first argument)") } if kbfsParams.Debug { fuseLog := logger.NewWithCallDepth("FUSE", 1) fuseLog.Configure("", true, "") fuse.Debug = func(msg interface{}) { fuseLog.Debug("%s", msg) } } mountpoint := flag.Arg(0) var mounter libfuse.Mounter if *mountType == "force" { mounter = libfuse.NewForceMounter(mountpoint, *platformParams) } else { mounter = libfuse.NewDefaultMounter(mountpoint, *platformParams) } options := libfuse.StartOptions{ KbfsParams: *kbfsParams, RuntimeDir: *runtimeDir, Label: *label, } return libfuse.Start(mounter, options) }
// Start the filesystem func Start(mounter Mounter, options StartOptions) *libfs.Error { // InitLog errors are non-fatal and are ignored. log, _ := libkbfs.InitLog(options.KbfsParams) if options.RuntimeDir != "" { info := libkb.NewServiceInfo(libkbfs.Version, libkbfs.PrereleaseBuild, options.Label, os.Getpid()) err := info.WriteFile(path.Join(options.RuntimeDir, "kbfs.info")) if err != nil { return libfs.InitError(err.Error()) } } log.Debug("Mounting: %s", mounter.Dir()) c, err := mounter.Mount() if err != nil { return libfs.MountError(err.Error()) } defer c.Close() onInterruptFn := func() { select { case <-c.Ready: // Was mounted, so try to unmount if it was successful. if c.MountError == nil { err = mounter.Unmount() if err != nil { return } } default: // Was not mounted successfully yet, so do nothing. Note that the mount // could still happen, but that's a rare enough edge case. } } log.Debug("Initializing") config, err := libkbfs.Init(options.KbfsParams, onInterruptFn, log) if err != nil { return libfs.InitError(err.Error()) } defer libkbfs.Shutdown() log.Debug("Creating filesystem") fs := NewFS(config, c, options.KbfsParams.Debug) ctx, cancel := context.WithCancel(context.Background()) defer cancel() ctx = context.WithValue(ctx, CtxAppIDKey, fs) log.Debug("Serving filesystem") fs.Serve(ctx) <-c.Ready err = c.MountError if err != nil { return libfs.MountError(err.Error()) } log.Debug("Ending") return nil }