summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2016-09-20 19:45:28 +0200
committerJakob Unterwurzacher2016-09-25 16:43:17 +0200
commitd9db75ebd263510dfcf93853f0e111012b82f828 (patch)
treeb631b9005a3e6bb518c3b990acb9f9f23612a369
parent3d59c7dd6a39312e8672185cc70b9c24e22380ec (diff)
main: factor out cli arg parsing
The main function has gotten way too big.
-rw-r--r--cli_args.go76
-rw-r--r--main.go61
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
+}
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 {