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 /daemonize.go | |
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".
Diffstat (limited to 'daemonize.go')
-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 |