X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/f578043391634ae1d345e84657fec7ecfb0f34a0..858fb9ebad77ceefc628344de26353d0a1936a9d:/socket.c diff --git a/socket.c b/socket.c index 790a86d9..674e3d7f 100644 --- a/socket.c +++ b/socket.c @@ -120,8 +120,6 @@ void start_accept_loop(int port, int (*fn)(int )) { int s; - signal(SIGCHLD, SIG_IGN); - /* open an incoming socket */ s = open_socket_in(SOCK_STREAM, port); if (s == -1) @@ -155,6 +153,15 @@ void start_accept_loop(int port, int (*fn)(int )) if (fd == -1) continue; + signal(SIGCHLD, SIG_IGN); + + /* we shouldn't have any children left hanging around + but I have had reports that on Digital Unix zombies + are produced, so this ensures that they are reaped */ +#ifdef WNOHANG + waitpid(-1, NULL, WNOHANG); +#endif + if (fork()==0) { close(s); @@ -274,27 +281,30 @@ become a daemon, discarding the controlling terminal ****************************************************************************/ void become_daemon(void) { - if (fork()) + int i; + + if (fork()) { _exit(0); + } /* detach from the terminal */ #ifdef HAVE_SETSID setsid(); #else #ifdef TIOCNOTTY - { - int i = open("/dev/tty", O_RDWR); - if (i >= 0) - { - ioctl(i, (int) TIOCNOTTY, (char *)0); - close(i); - } + i = open("/dev/tty", O_RDWR); + if (i >= 0) { + ioctl(i, (int) TIOCNOTTY, (char *)0); + close(i); } #endif /* TIOCNOTTY */ #endif - close(0); - close(1); - close(2); + /* make sure that stdin, stdout an stderr don't stuff things + up (library functions, for example) */ + for (i=0;i<3;i++) { + close(i); + open("/dev/null", O_RDWR); + } } /*******************************************************************