X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=daemon.c;h=8f39e86cfe48f18b1c9ed0e86a0039e26258f00f;hb=f16d8d23439b5569f0c2e1af22494708b507f277;hp=5ae73ed69565c6bd0d299b85e503494d0d448100;hpb=82d02e1f39249cce1362c0a41c4fe2a7005ae835;p=~andy%2Ffetchmail diff --git a/daemon.c b/daemon.c index 5ae73ed6..8f39e86c 100644 --- a/daemon.c +++ b/daemon.c @@ -11,39 +11,15 @@ #include #include #include -#ifdef HAVE_SYS_WAIT_H #include -#endif -#ifdef HAVE_FCNTL_H #include -#else /* !HAVE_FCNTL_H */ -#ifdef HAVE_SYS_FCNTL_H -#include -#endif /* HAVE_SYS_FCNTL_H */ -#endif /* !HAVE_FCNTL_H */ #include /* get umask(2) prototyped */ -#if defined(HAVE_UNISTD_H) #include -#endif -#if defined(STDC_HEADERS) #include -#endif - -#if defined(QNX) -#include -#endif - -#if !defined(HAVE_SETSID) && defined(SIGTSTP) -#if defined(HAVE_TERMIOS_H) -# include /* for TIOCNOTTY under Linux */ -#endif -#if !defined(TIOCNOTTY) && defined(HAVE_SGTTY_H) -# include /* for TIOCNOTTY under NEXTSTEP */ -#endif -#endif /* !defined(HAVE_SETSID) && defined(SIGTSTP) */ +#include /* for TIOCNOTTY under Linux */ /* BSD portability hack */ #if !defined(SIGCHLD) && defined(SIGCLD) @@ -53,35 +29,19 @@ #include "fetchmail.h" #include "tunable.h" -static RETSIGTYPE +static void sigchld_handler (int sig) /* process SIGCHLD to obtain the exit code of the terminating process */ { -#if defined(HAVE_WAITPID) /* the POSIX way */ int status; 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 - int status; -#endif - - while ((pid = wait3(&status, WNOHANG, 0)) > 0) - continue; /* swallow 'em up. */ -#else /* Zooks! Nothing to do but wait(), and hope we don't block... */ - int status; - - wait(&status); -#endif lastsig = SIGCHLD; (void)sig; } -RETSIGTYPE null_signal_handler(int sig) { (void)sig; } +void null_signal_handler(int sig) { (void)sig; } SIGHANDLERTYPE set_signal_handler(int sig, SIGHANDLERTYPE handler) /* @@ -92,37 +52,23 @@ SIGHANDLERTYPE set_signal_handler(int sig, SIGHANDLERTYPE handler) */ { SIGHANDLERTYPE rethandler; -#ifdef HAVE_SIGACTION struct sigaction sa_new, sa_old; memset (&sa_new, 0, sizeof sa_new); sigemptyset (&sa_new.sa_mask); sa_new.sa_handler = handler; sa_new.sa_flags = 0; -#ifdef SA_RESTART /* SunOS 4.1 portability hack */ /* system call should restart on all signals except SIGALRM */ if (sig != SIGALRM) sa_new.sa_flags |= SA_RESTART; -#endif -#ifdef SA_NOCLDSTOP /* SunOS 4.1 portability hack */ if (sig == SIGCHLD) sa_new.sa_flags |= SA_NOCLDSTOP; -#endif sigaction(sig, &sa_new, &sa_old); rethandler = sa_old.sa_handler; #if defined(SIGPWR) if (sig == SIGCHLD) sigaction(SIGPWR, &sa_new, NULL); #endif -#else /* HAVE_SIGACTION */ - rethandler = signal(sig, handler); -#if defined(SIGPWR) - if (sig == SIGCHLD) - signal(SIGPWR, handler); -#endif - /* system call should restart on all signals except SIGALRM */ - siginterrupt(sig, sig == SIGALRM); -#endif /* HAVE_SIGACTION */ return rethandler; } @@ -170,38 +116,11 @@ daemonize (const char *logfile) /* Make ourselves the leader of a new process group with no controlling terminal */ -#if defined(HAVE_SETSID) /* POSIX */ /* POSIX makes this soooo easy to do */ if (setsid() < 0) { report(stderr, "setsid (%s)\n", strerror(errno)); return(PS_IOERR); } -#elif defined(SIGTSTP) /* BSD */ - /* change process group */ -#ifndef __EMX__ - setpgrp(0, getpid()); -#endif - /* lose controlling tty */ - if ((fd = open("/dev/tty", O_RDWR)) >= 0) { - ioctl(fd, TIOCNOTTY, (char *) 0); - close(fd); /* not checking should be safe, there were no writes */ - } -#else /* SVR3 and older */ - /* change process group */ -#ifndef __EMX__ - setpgrp(); -#endif - - /* lose controlling tty */ - set_signal_handler(SIGHUP, SIG_IGN); - if ((childpid = fork()) < 0) { - report(stderr, "fork (%s)\n", strerror(errno)); - return(PS_IOERR); - } - else if (childpid > 0) { - exit(0); /* parent */ - } -#endif nottyDetach: