diff options
| author | Jakob Unterwurzacher | 2018-06-07 23:06:03 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2018-06-07 23:09:27 +0200 | 
| commit | fb772da6975eec186161fb00ededc2aef43f9eb9 (patch) | |
| tree | dbc30f31d27c5bc933a0a2ea2ed22d67878a075a | |
| parent | 10212d791a3196c2c8705a7a3cccdeb14a8efdbe (diff) | |
main: forkChild: try to read /proc/self/exe
On Linux, where /proc exists, this makes sure that we are
executing ourselves again, and not some other copy of the
gocryptfs executable.
This usually does not matter, but mount(1) unsets $PATH
and sets argv[0] to just "gocryptfs".
| -rw-r--r-- | daemonize.go | 9 | 
1 files changed, 8 insertions, 1 deletions
| diff --git a/daemonize.go b/daemonize.go index abb6d08..5215b2c 100644 --- a/daemonize.go +++ b/daemonize.go @@ -28,6 +28,13 @@ func exitOnUsr1() {  // This is a workaround for the missing true fork function in Go.  func forkChild() int {  	name := os.Args[0] +	// Use the full path to our executable if we can get if from /proc. +	buf := make([]byte, syscall.PathMax) +	n, err := syscall.Readlink("/proc/self/exe", buf) +	if err == nil { +		name = string(buf[:n]) +		tlog.Debug.Printf("forkChild: readlink worked: %q", name) +	}  	newArgs := []string{"-fg", fmt.Sprintf("-notifypid=%d", os.Getpid())}  	newArgs = append(newArgs, os.Args[1:]...)  	c := exec.Command(name, newArgs...) @@ -35,7 +42,7 @@ func forkChild() int {  	c.Stderr = os.Stderr  	c.Stdin = os.Stdin  	exitOnUsr1() -	err := c.Start() +	err = c.Start()  	if err != nil {  		tlog.Fatal.Printf("forkChild: starting %s failed: %v", name, err)  		return exitcodes.ForkChild | 
