From d0da38ee3f178d260ccb80875d5d5fd7e9b3fd98 Mon Sep 17 00:00:00 2001 From: Matthias Andree Date: Mon, 7 Aug 2006 09:32:34 +0000 Subject: --logfile is now handled more carefully, errors opening the logfile are now reported to the TTY where fetchmail was started from. fetchmail now complains and aborts when it cannot properly daemonize itself. svn path=/branches/BRANCH_6-3/; revision=4883 --- daemon.c | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'daemon.c') diff --git a/daemon.c b/daemon.c index 7416437d..feacfedc 100644 --- a/daemon.c +++ b/daemon.c @@ -135,7 +135,7 @@ 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 @@ -205,41 +205,42 @@ daemonize (const char *logfile) 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)); + 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; /* use /dev/null */ + } else + logfd = 0; /* this is /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 -- cgit v1.2.3