summaryrefslogtreecommitdiffstats
path: root/usr.sbin/daemon
diff options
context:
space:
mode:
authortrociny <trociny@FreeBSD.org>2013-09-19 18:00:05 +0000
committertrociny <trociny@FreeBSD.org>2013-09-19 18:00:05 +0000
commit8ecfe4666e7be9cea4cf6c3ef929de2e8d286f41 (patch)
tree84df2e403ab35adbfe89de9af7202497ea19e78e /usr.sbin/daemon
parent6f13d59af69b7ada8e66d9c471643c2d97d4fb69 (diff)
downloadFreeBSD-src-8ecfe4666e7be9cea4cf6c3ef929de2e8d286f41.zip
FreeBSD-src-8ecfe4666e7be9cea4cf6c3ef929de2e8d286f41.tar.gz
1. Properly clean pid files in the case of the error.
2. Write the supervisor pid before the restart loop, so we don't uselessly rewrite it after every child restart. 3. Remove duplicate ppfh and pfh initialization. Approved by: re (glebius) MFC after: 2 weeks
Diffstat (limited to 'usr.sbin/daemon')
-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