diff options
Diffstat (limited to 'daemonize.go')
-rw-r--r-- | daemonize.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/daemonize.go b/daemonize.go index de09743..886a229 100644 --- a/daemonize.go +++ b/daemonize.go @@ -8,6 +8,7 @@ import ( "syscall" "github.com/rfjakob/gocryptfs/internal/exitcodes" + "github.com/rfjakob/gocryptfs/internal/syscallcompat" "github.com/rfjakob/gocryptfs/internal/tlog" ) @@ -52,3 +53,44 @@ func forkChild() int { // The child exited with 0 - let's do the same. return 0 } + +// redirectStdFds redirects stderr and stdout to syslog; stdin to /dev/null +func redirectStdFds() { + // stderr and stdout + pr, pw, err := os.Pipe() + if err != nil { + tlog.Warn.Printf("redirectStdFds: could not create pipe: %v\n", err) + return + } + tag := fmt.Sprintf("gocryptfs-%d-logger", os.Getpid()) + cmd := exec.Command("logger", "-t", tag) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Stdin = pr + err = cmd.Start() + if err != nil { + tlog.Warn.Printf("redirectStdFds: could not start logger: %v\n", err) + } + pr.Close() + err = syscallcompat.Dup3(int(pw.Fd()), 1, 0) + if err != nil { + tlog.Warn.Printf("redirectStdFds: stdout dup error: %v\n", err) + } + syscallcompat.Dup3(int(pw.Fd()), 2, 0) + if err != nil { + tlog.Warn.Printf("redirectStdFds: stderr dup error: %v\n", err) + } + pw.Close() + + // stdin + nullFd, err := os.Open("/dev/null") + if err != nil { + tlog.Warn.Printf("redirectStdFds: could not open /dev/null: %v\n", err) + return + } + err = syscallcompat.Dup3(int(nullFd.Fd()), 0, 0) + if err != nil { + tlog.Warn.Printf("redirectStdFds: stdin dup error: %v\n", err) + } + nullFd.Close() +} |