Merge branch 'jc/waitpid'
authorJunio C Hamano <junkio@cox.net>
Thu, 22 Jun 2006 09:19:08 +0000 (02:19 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 22 Jun 2006 09:19:08 +0000 (02:19 -0700)
* jc/waitpid:
Restore SIGCHLD to SIG_DFL where we care about waitpid().

1  2 
daemon.c
diff --combined daemon.c
index bdfe80d2e4f4fc13ad45bd35aeeeb3ec71422a4f,10670047f267e86a6831562749914a8cf4187334..a19b7b5aaad228396f08b00c9925c555859393b4
+++ 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;
        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];
  
        }
  
        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);