summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/daemon/daemon.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c
index 5ae4fff..322c0d4 100644
--- a/usr.sbin/daemon/daemon.c
+++ b/usr.sbin/daemon/daemon.c
@@ -55,13 +55,12 @@ main(int argc, char *argv[])
{
struct pidfh *ppfh, *pfh;
sigset_t mask, oldmask;
- int ch, nochdir, noclose, restart;
+ int ch, nochdir, noclose, restart, serrno;
const char *pidfile, *ppidfile, *user;
pid_t otherpid, pid;
nochdir = noclose = 1;
restart = 0;
- ppfh = pfh = NULL;
ppidfile = pidfile = user = NULL;
while ((ch = getopt(argc, argv, "cfp:P:ru:")) != -1) {
switch (ch) {
@@ -108,11 +107,13 @@ main(int argc, char *argv[])
err(2, "pidfile ``%s''", pidfile);
}
}
-
- /* do same for actual daemon process */
+ /* Do the same for actual daemon process. */
if (ppidfile != NULL) {
ppfh = pidfile_open(ppidfile, 0600, &otherpid);
if (ppfh == NULL) {
+ serrno = errno;
+ pidfile_remove(pfh);
+ errno = serrno;
if (errno == EEXIST) {
errx(3, "process already running, pid: %d",
otherpid);
@@ -121,8 +122,12 @@ main(int argc, char *argv[])
}
}
- if (daemon(nochdir, noclose) == -1)
- err(1, NULL);
+ if (daemon(nochdir, noclose) == -1) {
+ warn("daemon");
+ goto exit;
+ }
+ /* Write out parent pidfile if needed. */
+ pidfile_write(ppfh);
/*
* If the pidfile or restart option is specified the daemon
@@ -139,22 +144,28 @@ main(int argc, char *argv[])
* Restore default action for SIGTERM in case the
* parent process decided to ignore it.
*/
- if (signal(SIGTERM, SIG_DFL) == SIG_ERR)
- err(1, "signal");
+ if (signal(SIGTERM, SIG_DFL) == SIG_ERR) {
+ warn("signal");
+ goto exit;
+ }
/*
* Because SIGCHLD is ignored by default, setup dummy handler
* for it, so we can mask it.
*/
- if (signal(SIGCHLD, dummy_sighandler) == SIG_ERR)
- err(1, "signal");
+ if (signal(SIGCHLD, dummy_sighandler) == SIG_ERR) {
+ warn("signal");
+ goto exit;
+ }
/*
* Block interesting signals.
*/
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
sigaddset(&mask, SIGCHLD);
- if (sigprocmask(SIG_SETMASK, &mask, &oldmask) == -1)
- err(1, "sigprocmask");
+ if (sigprocmask(SIG_SETMASK, &mask, &oldmask) == -1) {
+ warn("sigprocmask");
+ goto exit;
+ }
/*
* Try to protect against pageout kill. Ignore the
* error, madvise(2) will fail only if a process does
@@ -168,8 +179,8 @@ restart:
*/
pid = fork();
if (pid == -1) {
- pidfile_remove(pfh);
- err(1, "fork");
+ warn("fork");
+ goto exit;
}
}
if (pid <= 0) {
@@ -192,18 +203,16 @@ restart:
*/
err(1, "%s", argv[0]);
}
- /* write out parent pidfile if needed */
- if (ppidfile != NULL)
- pidfile_write(ppfh);
setproctitle("%s[%d]", argv[0], pid);
if (wait_child(pid, &mask) == 0 && restart) {
sleep(1);
goto restart;
}
+exit:
pidfile_remove(pfh);
pidfile_remove(ppfh);
- exit(0); /* Exit status does not matter. */
+ exit(1); /* If daemon(3) succeeded exit status does not matter. */
}
static void
OpenPOWER on IntegriCloud