I've had reports of rsyncd leaving zombies under digital unix. This
patch tries to address the problem in two ways:

1) reinstall the SIGCHLD handler before each fork
2) reap any children not caught by the handler using waitpid with
WNOHANG.

I expect this will fix the problem.
diff --git a/socket.c b/socket.c
index 790a86d..98093fc 100644
--- a/socket.c
+++ b/socket.c
@@ -120,8 +120,6 @@
 {
 	int s;
 
-	signal(SIGCHLD, SIG_IGN);
-
 	/* open an incoming socket */
 	s = open_socket_in(SOCK_STREAM, port);
 	if (s == -1)
@@ -155,6 +153,15 @@
 
 		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);