git-diff: fix combined diff
[gitweb.git] / daemon.c
index ad8492873ea1db63d56c24bec6174c4682105433..66f8d6f03d91d7dfa4a164137ee0310ca26dc1aa 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -1,20 +1,10 @@
-#include <signal.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/poll.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <syslog.h>
-#include <pwd.h>
-#include <grp.h>
-#include <limits.h>
-#include "pkt-line.h"
 #include "cache.h"
+#include "pkt-line.h"
 #include "exec_cmd.h"
 #include "interpolate.h"
 
+#include <syslog.h>
+
 #ifndef HOST_NAME_MAX
 #define HOST_NAME_MAX 256
 #endif
@@ -112,7 +102,7 @@ static void logreport(int priority, const char *err, va_list params)
        buf[buflen++] = '\n';
        buf[buflen] = '\0';
 
-       write(2, buf, buflen);
+       write_in_full(2, buf, buflen);
 }
 
 static void logerror(const char *err, ...)
@@ -382,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) {
@@ -411,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)
 {
@@ -450,6 +447,8 @@ void fill_in_extra_table_entries(struct interp *itable)
         * Replace literal host with lowercase-ized hostname.
         */
        hp = interp_table[INTERP_SLOT_HOST].value;
+       if (!hp)
+               return;
        for ( ; *hp; hp++)
                *hp = tolower(*hp);
 
@@ -544,8 +543,10 @@ static int execute(struct sockaddr *addr)
                loginfo("Extended attributes (%d bytes) exist <%.*s>",
                        (int) pktlen - len,
                        (int) pktlen - len, line + len + 1);
-       if (len && line[len-1] == '\n')
+       if (len && line[len-1] == '\n') {
                line[--len] = 0;
+               pktlen--;
+       }
 
        /*
         * Initialize the path interpolation table for this connection.
@@ -772,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));
@@ -819,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;
 
@@ -838,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;
@@ -870,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;