summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Unterwurzacher2015-11-09 23:21:11 +0100
committerJakob Unterwurzacher2015-11-09 23:33:35 +0100
commit51fcf61630905f5dc9370e18522cd0a6c086856d (patch)
tree28fb05508d5c7227b07e01d20360b98e14606473
parent273d8086aefdcdbd361d9be31d362b128a3f60f4 (diff)
Use new arg "-notifypid" for more robust daemonization
No more string matching on the parent command line!
-rw-r--r--TODO.md1
-rw-r--r--daemonize.go3
-rw-r--r--main.go10
-rw-r--r--sendusr1.go33
4 files changed, 16 insertions, 31 deletions
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)
}
}