aboutsummaryrefslogtreecommitdiffstats
path: root/daemon.c
diff options
context:
space:
mode:
authorMatthias Andree <matthias.andree@gmx.de>2006-08-07 09:32:34 +0000
committerMatthias Andree <matthias.andree@gmx.de>2006-08-07 09:32:34 +0000
commitd0da38ee3f178d260ccb80875d5d5fd7e9b3fd98 (patch)
tree038277755fb8f7b82b9c3f244132be3dc74369a3 /daemon.c
parent8f9f7375e656c9d339805df343bdb88f57c6eeff (diff)
downloadfetchmail-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.c51
1 files changed, 26 insertions, 25 deletions
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