Merge branch 'js/daemon-log'
authorJunio C Hamano <gitster@pobox.com>
Thu, 2 Jul 2009 02:41:00 +0000 (19:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 2 Jul 2009 02:41:00 +0000 (19:41 -0700)
* js/daemon-log:
receive-pack: do not send error details to the client
upload-pack: squelch progress indicator if client cannot see it
daemon: send stderr of service programs to the syslog

1  2 
daemon.c
diff --combined daemon.c
index 366db37b39f7dcfb29dbb4e79ad5bcc985b75bc6,a7834efbab7cc35754be6b81481c4876d13ee92d..76a400557d0e8c615d6cceae511e3c7684131f04
+++ b/daemon.c
@@@ -1,6 -1,8 +1,8 @@@
  #include "cache.h"
  #include "pkt-line.h"
  #include "exec_cmd.h"
+ #include "run-command.h"
+ #include "strbuf.h"
  
  #include <syslog.h>
  
@@@ -343,28 -345,66 +345,66 @@@ static int run_service(char *dir, struc
        return service->fn();
  }
  
+ static void copy_to_log(int fd)
+ {
+       struct strbuf line = STRBUF_INIT;
+       FILE *fp;
+       fp = fdopen(fd, "r");
+       if (fp == NULL) {
+               logerror("fdopen of error channel failed");
+               close(fd);
+               return;
+       }
+       while (strbuf_getline(&line, fp, '\n') != EOF) {
+               logerror("%s", line.buf);
+               strbuf_setlen(&line, 0);
+       }
+       strbuf_release(&line);
+       fclose(fp);
+ }
+ static int run_service_command(const char **argv)
+ {
+       struct child_process cld;
+       memset(&cld, 0, sizeof(cld));
+       cld.argv = argv;
+       cld.git_cmd = 1;
+       cld.err = -1;
+       if (start_command(&cld))
+               return -1;
+       close(0);
+       close(1);
+       copy_to_log(cld.err);
+       return finish_command(&cld);
+ }
  static int upload_pack(void)
  {
        /* Timeout as string */
        char timeout_buf[64];
+       const char *argv[] = { "upload-pack", "--strict", timeout_buf, ".", NULL };
  
        snprintf(timeout_buf, sizeof timeout_buf, "--timeout=%u", timeout);
-       /* git-upload-pack only ever reads stuff, so this is safe */
-       execl_git_cmd("upload-pack", "--strict", timeout_buf, ".", NULL);
-       return -1;
+       return run_service_command(argv);
  }
  
  static int upload_archive(void)
  {
-       execl_git_cmd("upload-archive", ".", NULL);
-       return -1;
+       static const char *argv[] = { "upload-archive", ".", NULL };
+       return run_service_command(argv);
  }
  
  static int receive_pack(void)
  {
-       execl_git_cmd("receive-pack", ".", NULL);
-       return -1;
+       static const char *argv[] = { "receive-pack", ".", NULL };
+       return run_service_command(argv);
  }
  
  static struct daemon_service daemon_service[] = {
@@@ -453,7 -493,7 +493,7 @@@ static void parse_host_arg(char *extra_
                memset(&hints, 0, sizeof(hints));
                hints.ai_flags = AI_CANONNAME;
  
 -              gai = getaddrinfo(hostname, 0, &hints, &ai);
 +              gai = getaddrinfo(hostname, NULL, &hints, &ai);
                if (!gai) {
                        struct sockaddr_in *sin_addr = (void *)ai->ai_addr;