aboutsummaryrefslogtreecommitdiff
path: root/daemonize.go
diff options
context:
space:
mode:
Diffstat (limited to 'daemonize.go')
-rw-r--r--daemonize.go42
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()
+}