Moved the is_in_group() function to uidlist.c.
[rsync/rsync.git] / socket.c
index bb7acc0..a19542f 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -374,7 +374,16 @@ int is_a_socket(int fd)
 }
 
 
-void start_accept_loop(int port, int (*fn)(int ))
+static RETSIGTYPE sigchld_handler(UNUSED(int val))
+{
+       signal(SIGCHLD, sigchld_handler);
+#ifdef WNOHANG
+       while (waitpid(-1, NULL, WNOHANG) > 0) {}
+#endif
+}
+
+
+void start_accept_loop(int port, int (*fn)(int, int))
 {
        int s;
        extern char *bind_address;
@@ -419,21 +428,17 @@ 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
-                while (waitpid(-1, NULL, WNOHANG) > 0);
-#endif
+               signal(SIGCHLD, sigchld_handler);
 
                if ((pid = fork()) == 0) {
+                       int ret;
                        close(s);
                        /* open log file in child before possibly giving
                           up privileges  */
                        log_open();
-                       _exit(fn(fd));
+                       ret = fn(fd, fd);
+                       close_all();
+                       _exit(ret);
                } else if (pid < 0) {
                        rprintf(FERROR,
                                RSYNC_NAME