diff options
author | Jakob Unterwurzacher | 2015-10-11 18:02:48 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2015-10-11 18:02:48 +0200 |
commit | 14115b061b253f3c58eee731e3b38dbb18fcf1fa (patch) | |
tree | 26592191dca7e5d1c469d1e7f5674634b0ecf81e | |
parent | 39183bea00f0d064f0cb96427dff150799d1dbe5 (diff) |
Add native daemonization
-rw-r--r-- | daemonize.go | 47 | ||||
-rw-r--r-- | main.go | 6 |
2 files changed, 52 insertions, 1 deletions
diff --git a/daemonize.go b/daemonize.go new file mode 100644 index 0000000..87faf33 --- /dev/null +++ b/daemonize.go @@ -0,0 +1,47 @@ +package main + +import ( + "syscall" + "os/exec" + "os" + "fmt" + "os/signal" +) + +// The child sends us USR1 if the mount was successful +func waitForUsr1() { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGUSR1) + <-c + os.Exit(0) +} + +// daemonize - execute ourselves once again, this time with the "-f" flag, and +// wait for SIGUSR1. +func daemonize() { + go waitForUsr1() + name := os.Args[0] + newArgs := []string{"-f"} + newArgs = append(newArgs, os.Args[1:]...) + c := exec.Command(name, newArgs...) + c.Stdout = os.Stdout + c.Stderr = os.Stderr + c.Stdin = os.Stdin + err := c.Start() + if err != nil { + fmt.Printf("daemonize: starting %s failed: %v\n", name) + os.Exit(1) + } + err = c.Wait() + if err != nil { + if exiterr, ok := err.(*exec.ExitError); ok { + if waitstat, ok := exiterr.Sys().(syscall.WaitStatus); ok { + os.Exit(waitstat.ExitStatus()) + } + } + fmt.Printf("daemonize: wait returned an unknown error: %v\n", err) + os.Exit(1) + } + // The child exited with 0 - let's do the same. + os.Exit(0) +} @@ -66,7 +66,7 @@ func main() { runtime.GOMAXPROCS(4) // Parse command line arguments - var debug, init, zerokey, fusedebug, openssl, passwd bool + var debug, init, zerokey, fusedebug, openssl, passwd, foreground bool var masterkey string flag.Usage = usageText @@ -76,10 +76,14 @@ func main() { flag.BoolVar(&zerokey, "zerokey", false, "Use all-zero dummy master key") flag.BoolVar(&openssl, "openssl", true, "Use OpenSSL instead of built-in Go crypto") flag.BoolVar(&passwd, "passwd", false, "Change password") + flag.BoolVar(&foreground, "f", false, "Stay in the foreground") flag.StringVar(&masterkey, "masterkey", "", "Mount with explicit master key") var cpuprofile = flag.String("cpuprofile", "", "Write cpu profile to specified file") flag.Parse() + if ! foreground { + daemonize() // does not return + } if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { |