X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=daemon.c;h=5ae73ed69565c6bd0d299b85e503494d0d448100;hb=da989f7b8294e342572ec5f27f1a6f3f2b1fe56f;hp=3dcb55c36d154176aca51f63ecbb773beeee9cb2;hpb=3c25e877da7ba4a11e0c9bd5f65f8857cb8f272b;p=~andy%2Ffetchmail diff --git a/daemon.c b/daemon.c index 3dcb55c3..5ae73ed6 100644 --- a/daemon.c +++ b/daemon.c @@ -57,15 +57,13 @@ static RETSIGTYPE sigchld_handler (int sig) /* process SIGCHLD to obtain the exit code of the terminating process */ { - extern volatile int lastsig; /* last signal received */ - pid_t pid; - #if defined(HAVE_WAITPID) /* the POSIX way */ int status; - while ((pid = waitpid(-1, &status, WNOHANG)) > 0) + while (waitpid(-1, &status, WNOHANG) > 0) continue; /* swallow 'em up. */ #elif defined(HAVE_WAIT3) /* the BSD way */ + pid_t pid; #if defined(HAVE_UNION_WAIT) && !defined(__FreeBSD__) union wait status; #else @@ -80,9 +78,10 @@ sigchld_handler (int sig) wait(&status); #endif lastsig = SIGCHLD; + (void)sig; } -RETSIGTYPE null_signal_handler(int sig) { } +RETSIGTYPE null_signal_handler(int sig) { (void)sig; } SIGHANDLERTYPE set_signal_handler(int sig, SIGHANDLERTYPE handler) /* @@ -133,10 +132,10 @@ void deal_with_sigchld(void) } int -daemonize (const char *logfile, void (*termhook)(int)) +daemonize (const char *logfile) /* detach from control TTY, become process group leader, catch SIGCHLD */ { - int fd; + int fd, logfd; pid_t childpid; /* if we are started by init (process 1) via /etc/inittab we needn't @@ -206,41 +205,41 @@ daemonize (const char *logfile, void (*termhook)(int)) nottyDetach: - /* Close any/all open file descriptors */ -#if defined(HAVE_GETDTABLESIZE) - for (fd = getdtablesize()-1; fd >= 0; fd--) -#elif defined(NOFILE) - for (fd = NOFILE-1; fd >= 0; fd--) -#else /* make an educated guess */ - for (fd = 19; fd >= 0; fd--) -#endif - { - close(fd); /* not checking this should be safe, no writes */ - } + (void)close(0); /* Reopen stdin descriptor on /dev/null */ - if ((fd = open("/dev/null", O_RDWR)) < 0) { /* stdin */ - report(stderr, "open: /dev/null (%s)\n", strerror(errno)); + if (open("/dev/null", O_RDWR) < 0) { /* stdin */ + report(stderr, "cannot open /dev/null: %s\n", strerror(errno)); return(PS_IOERR); } if (logfile) { - if ((fd = open(logfile, O_CREAT|O_WRONLY|O_APPEND, 0666)) < 0) { /* stdout */ - report(stderr, "open %s (%s)\n", logfile, strerror(errno)); - return(PS_IOERR); - } + if ((logfd = open(logfile, O_CREAT|O_WRONLY|O_APPEND, 0666)) < 0) { /* stdout */ + report(stderr, "cannot open %s: %s\n", logfile, strerror(errno)); + return PS_IOERR; + } + } else + logfd = 0; /* else use /dev/null */ + + /* Close any/all open file descriptors */ +#if defined(HAVE_GETDTABLESIZE) + fd = getdtablesize() - 1; +#elif defined(NOFILE) + fd = NOFILE - 1; +#else /* make an educated guess */ + fd = 1023; +#endif + while (fd >= 1) { + if (fd != logfd) + close(fd); /* not checking this should be safe, no writes */ + -- fd; } - else - { - if (dup(fd) < 0) { /* stdout */ + + if (dup(logfd) < 0 /* stdout */ + || ((logfd == 0 || logfd >= 3) && dup(logfd) < 0)) { /* stderr */ report(stderr, "dup (%s)\n", strerror(errno)); return(PS_IOERR); - } - } - if (dup(fd) < 0) { /* stderr */ - report(stderr, "dup (%s)\n", strerror(errno)); - return(PS_IOERR); } #ifdef HAVE_GETCWD @@ -260,7 +259,7 @@ nottyDetach: return(0); } -flag isafile(int fd) +flag is_a_file(int fd) /* is the given fd attached to a file? (used to control logging) */ { struct stat stbuf;