From: Junio C Hamano Date: Thu, 22 Jun 2006 09:19:08 +0000 (-0700) Subject: Merge branch 'jc/waitpid' X-Git-Tag: v1.4.1-rc1^2~5 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/b879de1812f390e20f5ac7eb3aad9f83db02fae1?ds=inline;hp=-c Merge branch 'jc/waitpid' * jc/waitpid: Restore SIGCHLD to SIG_DFL where we care about waitpid(). --- b879de1812f390e20f5ac7eb3aad9f83db02fae1 diff --combined daemon.c index bdfe80d2e4,10670047f2..a19b7b5aaa --- a/daemon.c +++ b/daemon.c @@@ -264,34 -264,11 +264,34 @@@ static int upload(char *dir return -1; } -static int execute(void) +static int execute(struct sockaddr *addr) { static char line[1000]; int pktlen, len; + if (addr) { + char addrbuf[256] = ""; + int port = -1; + + if (addr->sa_family == AF_INET) { + struct sockaddr_in *sin_addr = (void *) addr; + inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf)); + port = sin_addr->sin_port; +#ifndef NO_IPV6 + } else if (addr && addr->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6_addr = (void *) addr; + + char *buf = addrbuf; + *buf++ = '['; *buf = '\0'; /* stpcpy() is cool */ + inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1); + strcat(buf, "]"); + + port = sin6_addr->sin6_port; +#endif + } + loginfo("Connection from %s:%d", addrbuf, port); + } + alarm(init_timeout ? init_timeout : timeout); pktlen = packet_read_line(0, line, sizeof(line)); alarm(0); @@@ -437,6 -414,8 +437,6 @@@ static void check_max_connections(void static void handle(int incoming, struct sockaddr *addr, int addrlen) { pid_t pid = fork(); - char addrbuf[256] = ""; - int port = -1; if (pid) { unsigned idx; @@@ -457,7 -436,26 +457,7 @@@ dup2(incoming, 1); close(incoming); - if (addr->sa_family == AF_INET) { - struct sockaddr_in *sin_addr = (void *) addr; - inet_ntop(AF_INET, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf)); - port = sin_addr->sin_port; - -#ifndef NO_IPV6 - } else if (addr->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6_addr = (void *) addr; - - char *buf = addrbuf; - *buf++ = '['; *buf = '\0'; /* stpcpy() is cool */ - inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1); - strcat(buf, "]"); - - port = sin6_addr->sin6_port; -#endif - } - loginfo("Connection from %s:%d", addrbuf, port); - - exit(execute()); + exit(execute(addr)); } static void child_handler(int signo) @@@ -673,6 -671,11 +673,11 @@@ int main(int argc, char **argv int inetd_mode = 0; int i; + /* Without this we cannot rely on waitpid() to tell + * what happened to our children. + */ + signal(SIGCHLD, SIG_DFL); + for (i = 1; i < argc; i++) { char *arg = argv[i]; @@@ -753,16 -756,8 +758,16 @@@ } if (inetd_mode) { + struct sockaddr_storage ss; + struct sockaddr *peer = (struct sockaddr *)&ss; + socklen_t slen = sizeof(ss); + fclose(stderr); //FIXME: workaround - return execute(); + + if (getpeername(0, peer, &slen)) + peer = NULL; + + return execute(peer); } return serve(port);