git-diff: fix combined diff
[gitweb.git] / daemon.c
index f039534d6536ae1898ffa618a6b077ff8ae14c90..66f8d6f03d91d7dfa4a164137ee0310ca26dc1aa 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -372,9 +372,16 @@ static int upload_archive(void)
        return -1;
 }
 
+static int receive_pack(void)
+{
+       execl_git_cmd("receive-pack", ".", NULL);
+       return -1;
+}
+
 static struct daemon_service daemon_service[] = {
        { "upload-archive", "uploadarch", upload_archive, 0, 1 },
        { "upload-pack", "uploadpack", upload_pack, 1, 1 },
+       { "receive-pack", "receivepack", receive_pack, 0, 1 },
 };
 
 static void enable_service(const char *name, int ena) {
@@ -401,7 +408,7 @@ static void make_service_overridable(const char *name, int ena) {
 
 /*
  * Separate the "extra args" information as supplied by the client connection.
- * Any resulting data is squirrelled away in the given interpolation table.
+ * Any resulting data is squirreled away in the given interpolation table.
  */
 static void parse_extra_args(struct interp *table, char *extra_args, int buflen)
 {
@@ -766,6 +773,7 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)
        char pbuf[NI_MAXSERV];
        struct addrinfo hints, *ai0, *ai;
        int gai;
+       long flags;
 
        sprintf(pbuf, "%d", listen_port);
        memset(&hints, 0, sizeof(hints));
@@ -813,6 +821,10 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)
                        continue;       /* not fatal */
                }
 
+               flags = fcntl(sockfd, F_GETFD, 0);
+               if (flags >= 0)
+                       fcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);
+
                socklist = xrealloc(socklist, sizeof(int) * (socknum + 1));
                socklist[socknum++] = sockfd;
 
@@ -832,6 +844,7 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)
 {
        struct sockaddr_in sin;
        int sockfd;
+       long flags;
 
        memset(&sin, 0, sizeof sin);
        sin.sin_family = AF_INET;
@@ -864,6 +877,10 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p)
                return 0;
        }
 
+       flags = fcntl(sockfd, F_GETFD, 0);
+       if (flags >= 0)
+               fcntl(sockfd, F_SETFD, flags | FD_CLOEXEC);
+
        *socklist_p = xmalloc(sizeof(int));
        **socklist_p = sockfd;
        return 1;