From 78d2b0944ba302f7c3026f0aea8dd450ebff8153 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 28 Jul 2008 23:24:25 +0200 Subject: reorder a few things, so that logging works properly very early already --- libdaemon/dfork.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'libdaemon/dfork.c') diff --git a/libdaemon/dfork.c b/libdaemon/dfork.c index be57c09..b0a99dc 100644 --- a/libdaemon/dfork.c +++ b/libdaemon/dfork.c @@ -183,16 +183,8 @@ pid_t daemon_fork(void) { pid_t dpid; /* First child */ - - if (sigaction(SIGCHLD, &sa_old, NULL) < 0) { - daemon_log(LOG_ERR, "close() failed: %s", strerror(errno)); - goto fail; - } - - if (sigprocmask(SIG_SETMASK, &ss_old, NULL) < 0) { - daemon_log(LOG_ERR, "sigprocmask() failed: %s", strerror(errno)); - goto fail; - } + if (daemon_log_use & DAEMON_LOG_AUTO) + daemon_log_use = DAEMON_LOG_SYSLOG; if (close(pipe_fds[0]) < 0) { daemon_log(LOG_ERR, "close() failed: %s", strerror(errno)); @@ -223,10 +215,11 @@ pid_t daemon_fork(void) { } setsid(); + setpgid(0, 0); umask(0777); if (chdir("/") < 0) { - daemon_log(LOG_ERR, "umask() failed: %s", strerror(errno)); + daemon_log(LOG_ERR, "chdir() failed: %s", strerror(errno)); goto fail; } @@ -238,6 +231,16 @@ pid_t daemon_fork(void) { int tty_fd; /* Second child */ + if (sigaction(SIGCHLD, &sa_old, NULL) < 0) { + daemon_log(LOG_ERR, "close() failed: %s", strerror(errno)); + goto fail; + } + + if (sigprocmask(SIG_SETMASK, &ss_old, NULL) < 0) { + daemon_log(LOG_ERR, "sigprocmask() failed: %s", strerror(errno)); + goto fail; + } + if (signal(SIGTTOU, SIG_IGN) == SIG_ERR) { daemon_log(LOG_ERR, "signal(SIGTTOU, SIG_IGN) failed: %s", strerror(errno)); goto fail; @@ -273,9 +276,6 @@ pid_t daemon_fork(void) { goto fail; } - if (daemon_log_use & DAEMON_LOG_AUTO) - daemon_log_use = DAEMON_LOG_SYSLOG; - return 0; } else { @@ -286,6 +286,7 @@ pid_t daemon_fork(void) { fail: dpid = (pid_t) -1; + if (atomic_write(pipe_fds[1], &dpid, sizeof(dpid)) != sizeof(dpid)) daemon_log(LOG_ERR, "Failed to write error PID: %s", strerror(errno)); -- cgit