diff options
| -rw-r--r-- | cli_args.go | 76 | ||||
| -rw-r--r-- | main.go | 61 | 
2 files changed, 77 insertions, 60 deletions
| 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 +} @@ -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 { | 
