diff --git a/cli_args.go b/cli_args.go new file mode 100644 index 0000000..413245c --- /dev/null +++ b/cli_args.go @@ -0,0 +1,76 @@ +package main + +import ( + "flag" + "os" + "strconv" + + "github.com/rfjakob/gocryptfs/internal/configfile" + "github.com/rfjakob/gocryptfs/internal/prefer_openssl" + "github.com/rfjakob/gocryptfs/internal/tlog" +) + +// argContainer stores the parsed CLI arguments +type argContainer struct { + debug, init, zerokey, fusedebug, openssl, passwd, foreground, version, + plaintextnames, quiet, nosyslog, wpanic, + longnames, allow_other, ro, reverse bool + masterkey, mountpoint, cipherdir, cpuprofile, config, extpass, + memprofile, o string + notifypid, scryptn int +} + +var flagSet *flag.FlagSet + +// parseCliArgs - parse command line arguments +func parseCliArgs() (args argContainer) { + var err error + var opensslAuto string + + flagSet = flag.NewFlagSet(tlog.ProgramName, flag.ExitOnError) + flagSet.Usage = usageText + flagSet.BoolVar(&args.debug, "d", false, "") + flagSet.BoolVar(&args.debug, "debug", false, "Enable debug output") + flagSet.BoolVar(&args.fusedebug, "fusedebug", false, "Enable fuse library debug output") + flagSet.BoolVar(&args.init, "init", false, "Initialize encrypted directory") + flagSet.BoolVar(&args.zerokey, "zerokey", false, "Use all-zero dummy master key") + // Tri-state true/false/auto + flagSet.StringVar(&opensslAuto, "openssl", "auto", "Use OpenSSL instead of built-in Go crypto") + flagSet.BoolVar(&args.passwd, "passwd", false, "Change password") + flagSet.BoolVar(&args.foreground, "f", false, "Stay in the foreground") + flagSet.BoolVar(&args.version, "version", false, "Print version and exit") + flagSet.BoolVar(&args.plaintextnames, "plaintextnames", false, "Do not encrypt file names") + flagSet.BoolVar(&args.quiet, "q", false, "") + flagSet.BoolVar(&args.quiet, "quiet", false, "Quiet - silence informational messages") + flagSet.BoolVar(&args.nosyslog, "nosyslog", false, "Do not redirect output to syslog when running in the background") + flagSet.BoolVar(&args.wpanic, "wpanic", false, "When encountering a warning, panic and exit immediately") + flagSet.BoolVar(&args.longnames, "longnames", true, "Store names longer than 176 bytes in extra files") + flagSet.BoolVar(&args.allow_other, "allow_other", false, "Allow other users to access the filesystem. "+ + "Only works if user_allow_other is set in /etc/fuse.conf.") + flagSet.BoolVar(&args.ro, "ro", false, "Mount the filesystem read-only") + flagSet.BoolVar(&args.reverse, "reverse", false, "Reverse mode") + flagSet.StringVar(&args.masterkey, "masterkey", "", "Mount with explicit master key") + flagSet.StringVar(&args.cpuprofile, "cpuprofile", "", "Write cpu profile to specified file") + flagSet.StringVar(&args.memprofile, "memprofile", "", "Write memory profile to specified file") + flagSet.StringVar(&args.config, "config", "", "Use specified config file instead of CIPHERDIR/gocryptfs.conf") + flagSet.StringVar(&args.extpass, "extpass", "", "Use external program for the password prompt") + flagSet.StringVar(&args.o, "o", "", "Pass additional mount options to the kernel, comma-separated list") + flagSet.IntVar(&args.notifypid, "notifypid", 0, "Send USR1 to the specified process after "+ + "successful mount - used internally for daemonization") + flagSet.IntVar(&args.scryptn, "scryptn", configfile.ScryptDefaultLogN, "scrypt cost parameter logN. "+ + "Setting this to a lower value speeds up mounting but makes the password susceptible to brute-force attacks") + flagSet.Parse(os.Args[1:]) + + // "-openssl" needs some post-processing + if opensslAuto == "auto" { + args.openssl = prefer_openssl.PreferOpenSSL() + } else { + args.openssl, err = strconv.ParseBool(opensslAuto) + if err != nil { + tlog.Fatal.Printf("Invalid \"-openssl\" setting: %v", err) + os.Exit(ERREXIT_USAGE) + } + } + + return args +} diff --git a/main.go b/main.go index 528824c..9034e3f 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "flag" "fmt" "log/syslog" "os" @@ -26,7 +25,6 @@ import ( "github.com/rfjakob/gocryptfs/internal/fusefrontend" "github.com/rfjakob/gocryptfs/internal/fusefrontend_reverse" "github.com/rfjakob/gocryptfs/internal/nametransform" - "github.com/rfjakob/gocryptfs/internal/prefer_openssl" "github.com/rfjakob/gocryptfs/internal/readpassword" "github.com/rfjakob/gocryptfs/internal/tlog" ) @@ -41,17 +39,6 @@ const ( ERREXIT_MOUNTPOINT = 10 ) -type argContainer struct { - debug, init, zerokey, fusedebug, openssl, passwd, foreground, version, - plaintextnames, quiet, nosyslog, wpanic, - longnames, allow_other, ro, reverse bool - masterkey, mountpoint, cipherdir, cpuprofile, config, extpass, - memprofile, o string - notifypid, scryptn int -} - -var flagSet *flag.FlagSet - const pleaseBuildBash = "[not set - please compile using ./build.bash]" // gocryptfs version according to git, set by build.bash @@ -169,54 +156,8 @@ func printVersion() { func main() { runtime.GOMAXPROCS(4) var err error - var args argContainer - // Parse command line arguments - var opensslAuto string - flagSet = flag.NewFlagSet(tlog.ProgramName, flag.ExitOnError) - flagSet.Usage = usageText - flagSet.BoolVar(&args.debug, "d", false, "") - flagSet.BoolVar(&args.debug, "debug", false, "Enable debug output") - flagSet.BoolVar(&args.fusedebug, "fusedebug", false, "Enable fuse library debug output") - flagSet.BoolVar(&args.init, "init", false, "Initialize encrypted directory") - flagSet.BoolVar(&args.zerokey, "zerokey", false, "Use all-zero dummy master key") - // Tri-state true/false/auto - flagSet.StringVar(&opensslAuto, "openssl", "auto", "Use OpenSSL instead of built-in Go crypto") - flagSet.BoolVar(&args.passwd, "passwd", false, "Change password") - flagSet.BoolVar(&args.foreground, "f", false, "Stay in the foreground") - flagSet.BoolVar(&args.version, "version", false, "Print version and exit") - flagSet.BoolVar(&args.plaintextnames, "plaintextnames", false, "Do not encrypt file names") - flagSet.BoolVar(&args.quiet, "q", false, "") - flagSet.BoolVar(&args.quiet, "quiet", false, "Quiet - silence informational messages") - flagSet.BoolVar(&args.nosyslog, "nosyslog", false, "Do not redirect output to syslog when running in the background") - flagSet.BoolVar(&args.wpanic, "wpanic", false, "When encountering a warning, panic and exit immediately") - flagSet.BoolVar(&args.longnames, "longnames", true, "Store names longer than 176 bytes in extra files") - flagSet.BoolVar(&args.allow_other, "allow_other", false, "Allow other users to access the filesystem. "+ - "Only works if user_allow_other is set in /etc/fuse.conf.") - flagSet.BoolVar(&args.ro, "ro", false, "Mount the filesystem read-only") - flagSet.BoolVar(&args.reverse, "reverse", false, "Reverse mode") - flagSet.StringVar(&args.masterkey, "masterkey", "", "Mount with explicit master key") - flagSet.StringVar(&args.cpuprofile, "cpuprofile", "", "Write cpu profile to specified file") - flagSet.StringVar(&args.memprofile, "memprofile", "", "Write memory profile to specified file") - flagSet.StringVar(&args.config, "config", "", "Use specified config file instead of CIPHERDIR/gocryptfs.conf") - flagSet.StringVar(&args.extpass, "extpass", "", "Use external program for the password prompt") - flagSet.StringVar(&args.o, "o", "", "Pass additional mount options to the kernel, comma-separated list") - flagSet.IntVar(&args.notifypid, "notifypid", 0, "Send USR1 to the specified process after "+ - "successful mount - used internally for daemonization") - flagSet.IntVar(&args.scryptn, "scryptn", configfile.ScryptDefaultLogN, "scrypt cost parameter logN. "+ - "Setting this to a lower value speeds up mounting but makes the password susceptible to brute-force attacks") - flagSet.Parse(os.Args[1:]) - - // "-openssl" needs some post-processing - if opensslAuto == "auto" { - args.openssl = prefer_openssl.PreferOpenSSL() - } else { - args.openssl, err = strconv.ParseBool(opensslAuto) - if err != nil { - tlog.Fatal.Printf("Invalid \"-openssl\" setting: %v", err) - os.Exit(ERREXIT_USAGE) - } - } + args := parseCliArgs() // Fork a child into the background if "-f" is not set AND we are mounting a filesystem if !args.foreground && flagSet.NArg() == 2 {