diff options
author | Matthias Andree <matthias.andree@gmx.de> | 2006-08-07 09:32:34 +0000 |
---|---|---|
committer | Matthias Andree <matthias.andree@gmx.de> | 2006-08-07 09:32:34 +0000 |
commit | d0da38ee3f178d260ccb80875d5d5fd7e9b3fd98 (patch) | |
tree | 038277755fb8f7b82b9c3f244132be3dc74369a3 /daemon.c | |
parent | 8f9f7375e656c9d339805df343bdb88f57c6eeff (diff) | |
download | fetchmail-d0da38ee3f178d260ccb80875d5d5fd7e9b3fd98.tar.gz fetchmail-d0da38ee3f178d260ccb80875d5d5fd7e9b3fd98.tar.bz2 fetchmail-d0da38ee3f178d260ccb80875d5d5fd7e9b3fd98.zip |
--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
Diffstat (limited to 'daemon.c')
-rw-r--r-- | daemon.c | 51 |
1 files changed, 26 insertions, 25 deletions
@@ -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 |