aboutsummaryrefslogtreecommitdiff
path: root/libexec/ftpd
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd')
-rw-r--r--libexec/ftpd/ftpd.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c
index a5a60a421be9..60779b4ebef9 100644
--- a/libexec/ftpd/ftpd.c
+++ b/libexec/ftpd/ftpd.c
@@ -495,22 +495,29 @@ main(int argc, char *argv[], char **envp)
fd = accept(ctl_sock[i],
(struct sockaddr *)&his_addr,
&addrlen);
- if (fd >= 0) {
- if ((pid = fork()) == 0)
- break;
- else
- close(fd);
+ if (fd == -1) {
+ syslog(LOG_WARNING,
+ "accept: %m");
+ continue;
+ }
+ switch (pid = fork()) {
+ case 0:
+ /* child */
+ (void) dup2(fd, 0);
+ (void) dup2(fd, 1);
+ (void) close(fd);
+ for (i = 1; i <= *ctl_sock; i++)
+ close(ctl_sock[i]);
+ if (pfh != NULL)
+ pidfile_close(pfh);
+ goto gotchild;
+ case -1:
+ syslog(LOG_WARNING, "fork: %m");
+ /* FALLTHROUGH */
+ default:
+ close(fd);
}
}
- if (pid == 0) {
- /* child */
- (void) dup2(fd, 0);
- (void) dup2(fd, 1);
- close(ctl_sock[i]);
- if (pfh != NULL)
- pidfile_close(pfh);
- break;
- }
}
} else {
addrlen = sizeof(his_addr);
@@ -520,6 +527,7 @@ main(int argc, char *argv[], char **envp)
}
}
+gotchild:
sa.sa_handler = SIG_DFL;
(void)sigaction(SIGCHLD, &sa, NULL);