put back debugging and reap children so no zombies
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Wed, 19 Jan 1983 12:24:54 +0000 (04:24 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Wed, 19 Jan 1983 12:24:54 +0000 (04:24 -0800)
SCCS-vsn: libexec/ftpd/ftpd.c 4.8

usr/src/libexec/ftpd/ftpd.c

index a25eaf2..cd56f1c 100644 (file)
@@ -53,6 +53,7 @@ char  *remotehost;
 struct servent *sp;
 
 int    lostconn();
 struct servent *sp;
 
 int    lostconn();
+int    reapchild();
 FILE   *getdatasock(), *dataconn();
 char   *ntoa();
 
 FILE   *getdatasock(), *dataconn();
 char   *ntoa();
 
@@ -61,7 +62,6 @@ main(argc, argv)
        char *argv[];
 {
        int ctrl, s, options = 0;
        char *argv[];
 {
        int ctrl, s, options = 0;
-       union wait status;
        char *cp;
 
        sp = getservbyname("ftp", "tcp");
        char *cp;
 
        sp = getservbyname("ftp", "tcp");
@@ -106,18 +106,27 @@ main(argc, argv)
                perror("ftpd: socket");
                sleep(5);
        }
                perror("ftpd: socket");
                sleep(5);
        }
+       if (options & SO_DEBUG)
+               if (setsockopt(s, SOL_SOCKET, SO_DEBUG, 0, 0) < 0)
+                       perror("ftpd: setsockopt (SO_DEBUG)");
+#ifdef notdef
+       if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0) < 0)
+               perror("ftpd: setsockopt (SO_KEEPALIVE)");
+#endif
        while (bind(s, &ctrl_addr, sizeof (ctrl_addr), 0) < 0) {
                perror("ftpd: bind");
                sleep(5);
        }
        while (bind(s, &ctrl_addr, sizeof (ctrl_addr), 0) < 0) {
                perror("ftpd: bind");
                sleep(5);
        }
+       signal(SIGCHLD, reapchild);
        listen(s, 10);
        for (;;) {
                int hisaddrlen = sizeof (his_addr);
 
                ctrl = accept(s, &his_addr, &hisaddrlen, 0);
                if (ctrl < 0) {
        listen(s, 10);
        for (;;) {
                int hisaddrlen = sizeof (his_addr);
 
                ctrl = accept(s, &his_addr, &hisaddrlen, 0);
                if (ctrl < 0) {
+                       if (errno == EINTR)
+                               continue;
                        perror("ftpd: accept");
                        perror("ftpd: accept");
-                       sleep(5);
                        continue;
                }
                if (fork() == 0) {
                        continue;
                }
                if (fork() == 0) {
@@ -144,11 +153,17 @@ main(argc, argv)
                        }
                }
                close(ctrl);
                        }
                }
                close(ctrl);
-               while (wait3(status, WNOHANG, 0) > 0)
-                       continue;
        }
 }
 
        }
 }
 
+reapchild()
+{
+       union wait status;
+
+       while (wait3(&status, WNOHANG, 0) > 0)
+               ;
+}
+
 lostconn()
 {
 
 lostconn()
 {