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
This commit is contained in:
Mikolaj Golub 2013-09-19 18:00:05 +00:00
parent 8a21c7fbe8
commit 9da0ef1316
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255707

View File

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