diff options
| -rw-r--r-- | TODO.md | 1 | ||||
| -rw-r--r-- | daemonize.go | 3 | ||||
| -rw-r--r-- | main.go | 10 | ||||
| -rw-r--r-- | sendusr1.go | 33 | 
4 files changed, 16 insertions, 31 deletions
| @@ -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 @@ -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)  	}  } | 
