From: Guillem Jover Date: Tue, 15 May 2007 02:53:36 +0000 (+0000) Subject: Make start-stop-daemon fork twice while daemonizing. Closes: #416179 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5097078d1fad2c63cb3253af67776a29f68bbda7;p=dpkg Make start-stop-daemon fork twice while daemonizing. Closes: #416179 --- diff --git a/ChangeLog b/ChangeLog index bcf0c6dc..d212e820 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-05-15 Guillem Jover + + * utils/start-stop-daemon.c (main): Move daemonizing code to ... + (daemonize): ... here. New function. Fork twice. + 2007-05-15 Guillem Jover * scripts/update-alternatives.pl: Call fill_missing_slavepaths at the diff --git a/debian/changelog b/debian/changelog index d9310ce2..dedf4d9e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -19,6 +19,7 @@ dpkg (1.14.3) UNRELEASED; urgency=low 'Info dir file'. Closes: #420766 * Document in deb-control.5 that the control file can have '#'-style comments. Closes: #406481 + * Make start-stop-daemon fork twice while daemonizing. Closes: #416179 [ Updated dpkg-dev translations ] * French (Frédéric Bothamy). Closes: #423392 diff --git a/utils/start-stop-daemon.c b/utils/start-stop-daemon.c index 76c39a07..b0ad886d 100644 --- a/utils/start-stop-daemon.c +++ b/utils/start-stop-daemon.c @@ -252,6 +252,36 @@ xgettimeofday(struct timeval *tv) fatal("gettimeofday failed: %s", strerror(errno)); } +static void +daemonize(void) +{ + pid_t pid; + + if (quietmode < 0) + printf("Detaching to start %s...", startas); + + pid = fork(); + if (pid < 0) + fatal("Unable to do first fork.\n"); + else if (pid) /* Parent */ + exit(0); + + /* Create a new session */ +#ifdef HAVE_SETSID + setsid(); +#else + setpgid(0, 0); +#endif + + pid = fork(); + if (pid < 0) + fatal("Unable to do second fork.\n"); + else if (pid) /* Parent */ + exit(0); + + if (quietmode < 0) + printf("done.\n"); +} static void push(struct pid_list **list, pid_t pid) @@ -1307,19 +1337,7 @@ main(int argc, char **argv) printf("Starting %s...\n", startas); *--argv = startas; if (background) { /* ok, we need to detach this process */ - int i; - if (quietmode < 0) - printf("Detaching to start %s...", startas); - i = fork(); - if (i<0) { - fatal("Unable to fork.\n"); - } - if (i) { /* parent */ - if (quietmode < 0) - printf("done.\n"); - exit(0); - } - /* child continues here */ + daemonize(); #ifdef HAVE_TIOCNOTTY tty_fd=open("/dev/tty", O_RDWR); @@ -1378,13 +1396,6 @@ main(int argc, char **argv) /* now close all extra fds */ for (i=getdtablesize()-1; i>=3; --i) close(i); #endif - - /* create a new session */ -#ifdef HAVE_SETSID - setsid(); -#else - setpgid(0,0); -#endif } execv(startas, argv); fatal("Unable to start %s: %s", startas, strerror(errno));