From c4a5c57dc3ad079ca7017f1881613937a602e72e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 18 Feb 2002 22:38:03 +0000 Subject: [PATCH] If the daemon is unable to fork a child to accept a connection, print an error message. (Colin Walters) --- NEWS | 5 ++++- socket.c | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index ee002893..3457da16 100644 --- a/NEWS +++ b/NEWS @@ -30,4 +30,7 @@ rsync 2.5.3 (not released yet) * Added --no-whole-file and --no-blocking-io options (Dave Dykstra) * Made the --write-batch and --read-batch options actually work - and added documentation in the man page (Jos Backus) + and added documentation in the man page (Jos Backus) + + * If the daemon is unable to fork a child to accept a connection, + print an error message. (Colin Walters) diff --git a/socket.c b/socket.c index 344c42e0..843c19b6 100644 --- a/socket.c +++ b/socket.c @@ -387,6 +387,7 @@ void start_accept_loop(int port, int (*fn)(int )) for each incoming connection */ while (1) { fd_set fds; + pid_t pid; int fd; struct sockaddr_storage addr; socklen_t addrlen = sizeof addr; @@ -418,12 +419,22 @@ void start_accept_loop(int port, int (*fn)(int )) while (waitpid(-1, NULL, WNOHANG) > 0); #endif - if (fork()==0) { + if ((pid = fork()) == 0) { close(s); /* open log file in child before possibly giving up privileges */ log_open(); _exit(fn(fd)); + } else if (pid < 0) { + rprintf(FERROR, + RSYNC_NAME + ": could not create child server process: %s\n", + strerror(errno)); + close(fd); + /* This might have happened because we're + * overloaded. Sleep briefly before trying to + * accept again. */ + sleep(2); } close(fd); -- 2.34.1