diff --git a/TODO.md b/TODO.md index ec64d2e..1f65807 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,3 @@ -* More robust daemonization, add cli parameter "--sendusr1=pid" * Add test filesystem for "--masterkey" containing an "It works!" file * Add fcntl file locking to make multiple concurrent mounts safe * add test case diff --git a/daemonize.go b/daemonize.go index 32255ca..4f09164 100644 --- a/daemonize.go +++ b/daemonize.go @@ -21,7 +21,8 @@ func waitForUsr1() { func daemonize() { go waitForUsr1() name := os.Args[0] - newArgs := []string{"-f"} + notifyArg := fmt.Sprintf("-notifypid=%d", os.Getpid()) + newArgs := []string{"-f", notifyArg} newArgs = append(newArgs, os.Args[1:]...) c := exec.Command(name, newArgs...) c.Stdout = os.Stdout diff --git a/main.go b/main.go index d848f90..e3acb3c 100644 --- a/main.go +++ b/main.go @@ -68,7 +68,7 @@ type argContainer struct { plaintextnames, quiet bool masterkey, mountpoint, cipherdir string cpuprofile *string - sendusr1 int + notifypid int } var flagSet *flag.FlagSet @@ -93,7 +93,7 @@ func main() { flagSet.BoolVar(&args.quiet, "q", false, "Quiet - silence informational messages") flagSet.StringVar(&args.masterkey, "masterkey", "", "Mount with explicit master key") args.cpuprofile = flagSet.String("cpuprofile", "", "Write cpu profile to specified file") - flagSet.IntVar(&args.sendusr1, "sendusr1", 0, + flagSet.IntVar(&args.notifypid, "notifypid", 0, "Send USR1 to the specified process after successful mount - used internally for daemonization") flagSet.Parse(os.Args[1:]) if args.version { @@ -221,8 +221,10 @@ func main() { } cryptfs.Info.Println("Filesystem ready.") - // Send notification to our parent - sendUsr1() + // Send USR1 notification + if args.notifypid > 0 { + sendUsr1(args.notifypid) + } // Wait for SIGING in the background and unmount ourselves if we get it // This prevents a dangling "Transport endpoint is not connected" mountpoint handleSigint(srv, args.mountpoint) diff --git a/sendusr1.go b/sendusr1.go index c5dbb7c..5de8a6f 100644 --- a/sendusr1.go +++ b/sendusr1.go @@ -1,38 +1,21 @@ package main import ( - "bytes" "fmt" - "io/ioutil" "os" "syscall" ) -const ( - wrapperContains = "gocryptfs\000" -) - -// Send USR1 to the parent process. This notifies it that the -// mounting has completed sucessfully. -// -// Checks /proc/$PPID/cmdline to make sure we do not kill an unrelated process. -func sendUsr1() { - ppid := os.Getppid() - fn := fmt.Sprintf("/proc/%d/cmdline", ppid) - cmdline, err := ioutil.ReadFile(fn) +// Send signal USR1 to "pid" (usually our parent process). This notifies it +// that the mounting has completed sucessfully. +func sendUsr1(pid int) { + p, err := os.FindProcess(pid) if err != nil { - fmt.Printf("sendUsr1: ReadFile: %v\n", err) + fmt.Printf("sendUsr1: FindProcess: %v\n", err) return } - if bytes.Contains(cmdline, []byte(wrapperContains)) { - p, err := os.FindProcess(ppid) - if err != nil { - fmt.Printf("sendUsr1: FindProcess: %v\n", err) - return - } - err = p.Signal(syscall.SIGUSR1) - if err != nil { - fmt.Printf("sendUsr1: Signal: %v\n", err) - } + err = p.Signal(syscall.SIGUSR1) + if err != nil { + fmt.Printf("sendUsr1: Signal: %v\n", err) } }