Merge with master.kernel.org:/pub/scm/git/git.git
authorH. Peter Anvin <hpa@smyrno.hos.anvin.org>
Fri, 30 Sep 2005 17:44:21 +0000 (10:44 -0700)
committerH. Peter Anvin <hpa@smyrno.hos.anvin.org>
Fri, 30 Sep 2005 17:44:21 +0000 (10:44 -0700)
1  2 
Makefile
daemon.c
diff --combined Makefile
index 1f4f31b53bc1439688abc82cf46389a5a3d1f280,e943954cf83da8732cfd2c1508929e5a21a76664..8b152dd5584f774aecc9bdf675cac14a55a98925
+++ b/Makefile
@@@ -29,8 -29,6 +29,8 @@@
  #
  # Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3.
  #
 +# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
 +#
  # Define COLLISION_CHECK below if you believe that SHA1's
  # 1461501637330902918203684832716283019655932542976 hashes do not give you
  # sufficient guarantee that no collisions between objects will ever happen.
@@@ -98,29 -96,31 +98,29 @@@ SCRIPT_PYTHON = 
  
  # The ones that do not have to link with lcrypto nor lz.
  SIMPLE_PROGRAMS = \
 -      git-get-tar-commit-id git-mailinfo git-mailsplit git-stripspace \
 -      git-daemon git-var
 +      git-get-tar-commit-id$(X) git-mailinfo$(X) git-mailsplit$(X) \
 +      git-stripspace$(X) git-var$(X) git-daemon$(X)
  
  # ... and all the rest
  PROGRAMS = \
 -      git-apply git-cat-file \
 -      git-checkout-index git-clone-pack git-commit-tree \
 -      git-convert-objects git-diff-files \
 -      git-diff-index git-diff-stages \
 -      git-diff-tree git-fetch-pack git-fsck-objects \
 -      git-hash-object git-init-db \
 -      git-local-fetch git-ls-files git-ls-tree git-merge-base \
 -      git-merge-index git-mktag git-pack-objects git-patch-id \
 -      git-peek-remote git-prune-packed git-read-tree \
 -      git-receive-pack git-rev-list git-rev-parse \
 -      git-send-pack git-show-branch \
 -      git-show-index git-ssh-fetch \
 -      git-ssh-upload git-tar-tree git-unpack-file \
 -      git-unpack-objects git-update-index git-update-server-info \
 -      git-upload-pack git-verify-pack git-write-tree \
 -      git-update-ref \
 -      $(SIMPLE_PROGRAMS)
 +      git-apply$(X) git-cat-file$(X) git-checkout-index$(X)           \
 +      git-clone-pack$(X) git-commit-tree$(X) git-convert-objects$(X)  \
 +      git-diff-files$(X) git-diff-index$(X) git-diff-stages$(X)       \
 +      git-diff-tree$(X) git-fetch-pack$(X) git-fsck-objects$(X)       \
 +      git-hash-object$(X) git-init-db$(X) git-local-fetch$(X)         \
 +      git-ls-files$(X) git-ls-tree$(X) git-merge-base$(X)             \
 +      git-merge-index$(X) git-mktag$(X) git-pack-objects$(X)          \
 +      git-patch-id$(X) git-peek-remote$(X) git-prune-packed$(X)       \
 +      git-read-tree$(X) git-receive-pack$(X) git-rev-list$(X)         \
 +      git-rev-parse$(X) git-send-pack$(X) git-show-branch$(X)         \
 +      git-show-index$(X) git-ssh-fetch$(X) git-ssh-upload$(X)         \
 +      git-tar-tree$(X) git-unpack-file$(X) git-unpack-objects$(X)     \
 +      git-update-index$(X) git-update-server-info$(X)                 \
 +      git-upload-pack$(X) git-verify-pack$(X) git-write-tree$(X)      \
 +      git-update-ref$(X) $(SIMPLE_PROGRAMS)
  
- # Backward compatibility -- to be removed in 0.99.8
+ # Backward compatibility -- to be removed after 1.0
 -PROGRAMS += git-ssh-pull git-ssh-push
 +PROGRAMS += git-ssh-pull$(X) git-ssh-push$(X)
  
  PYMODULES = \
        gitMergeCommon.py
@@@ -172,12 -172,6 +172,12 @@@ ifeq ($(shell uname -s),SunOS
        TAR = gtar
        PLATFORM_DEFINES += -D__EXTENSIONS__
  endif
 +ifeq ($(shell uname -o),Cygwin)
 +      NO_STRCASESTR = YesPlease
 +      NEEDS_LIBICONV = YesPlease
 +      NO_IPV6 = YesPlease
 +      X = .exe
 +endif
  ifneq (,$(findstring arm,$(shell uname -m)))
        ARM_SHA1 = YesPlease
  endif
@@@ -190,7 -184,7 +190,7 @@@ ifndef NO_CUR
        else
                CURL_LIBCURL = -lcurl
        endif
 -      PROGRAMS += git-http-fetch
 +      PROGRAMS += git-http-fetch$(X)
  endif
  
  ifndef SHELL_PATH
@@@ -233,9 -227,6 +233,9 @@@ ifdef NO_STRCASEST
        DEFINES += -Dstrcasestr=gitstrcasestr
        LIB_OBJS += compat/strcasestr.o
  endif
 +ifdef NO_IPV6
 +      DEFINES += -DNO_IPV6 -Dsockaddr_storage=sockaddr_in
 +endif
  
  ifdef PPC_SHA1
        SHA1_HEADER = "ppc/sha1.h"
@@@ -299,30 -290,30 +299,30 @@@ $(patsubst %.py,%,$(SCRIPT_PYTHON)) : 
  %.o: %.S
        $(CC) -o $*.o -c $(ALL_CFLAGS) $<
  
 -git-%: %.o $(LIB_FILE)
 +git-%$(X): %.o $(LIB_FILE)
        $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIBS)
  
 -git-mailinfo : SIMPLE_LIB += $(LIB_4_ICONV)
 +git-mailinfo$(X) : SIMPLE_LIB += $(LIB_4_ICONV)
  $(SIMPLE_PROGRAMS) : $(LIB_FILE)
 -$(SIMPLE_PROGRAMS) : git-% : %.o
 +$(SIMPLE_PROGRAMS) : git-%$(X) : %.o
        $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIB_FILE) $(SIMPLE_LIB)
  
 -git-http-fetch: fetch.o
 -git-local-fetch: fetch.o
 -git-ssh-fetch: rsh.o fetch.o
 -git-ssh-upload: rsh.o
 -git-ssh-pull: rsh.o fetch.o
 -git-ssh-push: rsh.o
 +git-http-fetch$(X): fetch.o
 +git-local-fetch$(X): fetch.o
 +git-ssh-fetch$(X): rsh.o fetch.o
 +git-ssh-upload$(X): rsh.o
 +git-ssh-pull$(X): rsh.o fetch.o
 +git-ssh-push$(X): rsh.o
  
 -git-http-fetch: LIBS += $(CURL_LIBCURL)
 -git-rev-list: LIBS += $(OPENSSL_LIBSSL)
 +git-http-fetch$(X): LIBS += $(CURL_LIBCURL)
 +git-rev-list$(X): LIBS += $(OPENSSL_LIBSSL)
  
  init-db.o: init-db.c
        $(CC) -c $(ALL_CFLAGS) \
                -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir)"' $*.c
  
  $(LIB_OBJS): $(LIB_H)
 -$(patsubst git-%,%.o,$(PROGRAMS)): $(LIB_H)
 +$(patsubst git-%$(X),%.o,$(PROGRAMS)): $(LIB_H)
  $(DIFF_OBJS): diffcore.h
  
  $(LIB_FILE): $(LIB_OBJS)
@@@ -337,10 -328,10 +337,10 @@@ doc
  test: all
        $(MAKE) -C t/ all
  
 -test-date: test-date.c date.o
 +test-date$(X): test-date.c date.o
        $(CC) $(ALL_CFLAGS) -o $@ test-date.c date.o
  
 -test-delta: test-delta.c diff-delta.o patch-delta.o
 +test-delta$(X): test-delta.c diff-delta.o patch-delta.o
        $(CC) $(ALL_CFLAGS) -o $@ $^
  
  check:
@@@ -354,6 -345,7 +354,7 @@@ install: $(PROGRAMS) $(SCRIPTS
        $(INSTALL) -d -m755 $(DESTDIR)$(bindir)
        $(INSTALL) $(PROGRAMS) $(SCRIPTS) $(DESTDIR)$(bindir)
        $(INSTALL) git-revert $(DESTDIR)$(bindir)/git-cherry-pick
+       sh ./cmd-rename.sh $(DESTDIR)$(bindir)
        $(MAKE) -C templates install
        $(INSTALL) -d -m755 $(DESTDIR)$(GIT_PYTHON_DIR)
        $(INSTALL) $(PYMODULES) $(DESTDIR)$(GIT_PYTHON_DIR)
diff --combined daemon.c
index 526ac782cf73cf42eb52e7db803500a13bfa3714,65e62d7bb16943ce47d426d817bc313889d68dfa..8366a33bcb45e4258bb8659e3fc95fde6a4570de
+++ b/daemon.c
@@@ -1,11 -1,9 +1,11 @@@
  #include "cache.h"
  #include "pkt-line.h"
 +#include <alloca.h>
  #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>
@@@ -59,7 -57,7 +59,7 @@@ static void logreport(int priority, con
        write(2, buf, buflen);
  }
  
- void logerror(const char *err, ...)
static void logerror(const char *err, ...)
  {
        va_list params;
        va_start(params, err);
@@@ -67,7 -65,7 +67,7 @@@
        va_end(params);
  }
  
- void loginfo(const char *err, ...)
static void loginfo(const char *err, ...)
  {
        va_list params;
        if (!verbose)
@@@ -330,7 -328,6 +330,7 @@@ static void handle(int incoming, struc
                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;
  
                strcat(buf, "]");
  
                port = sin6_addr->sin6_port;
 +#endif
        }
        loginfo("Connection from %s:%d", addrbuf, port);
  
@@@ -373,16 -369,16 +373,16 @@@ static void child_handler(int signo
        }
  }
  
 -static int serve(int port)
 +#ifndef NO_IPV6
 +
 +static int socksetup(int port, int **socklist_p)
  {
 -      struct addrinfo hints, *ai0, *ai;
 -      int gai;
        int socknum = 0, *socklist = NULL;
        int maxfd = -1;
 -      fd_set fds_init, fds;
        char pbuf[NI_MAXSERV];
  
 -      signal(SIGCHLD, child_handler);
 +      struct addrinfo hints, *ai0, *ai;
 +      int gai;
  
        sprintf(pbuf, "%d", port);
        memset(&hints, 0, sizeof(hints));
        if (gai)
                die("getaddrinfo() failed: %s\n", gai_strerror(gai));
  
 -      FD_ZERO(&fds_init);
 -
        for (ai = ai0; ai; ai = ai->ai_next) {
                int sockfd;
                int *newlist;
                socklist = newlist;
                socklist[socknum++] = sockfd;
  
 -              FD_SET(sockfd, &fds_init);
                if (maxfd < sockfd)
                        maxfd = sockfd;
        }
  
        freeaddrinfo(ai0);
  
 -      if (socknum == 0)
 -              die("unable to allocate any listen sockets on port %u", port);
 +      *socklist_p = socklist;
 +      return socknum;
 +}
 +
 +#else /* NO_IPV6 */
 +
 +static int socksetup(int port, int **socklist_p)
 +{
 +      struct sockaddr_in sin;
 +      int sockfd;
 +
 +      sockfd = socket(AF_INET, SOCK_STREAM, 0);
 +      if (sockfd < 0)
 +              return 0;
 +
 +      memset(&sin, 0, sizeof sin);
 +      sin.sin_family = AF_INET;
 +      sin.sin_addr.s_addr = htonl(INADDR_ANY);
 +      sin.sin_port = htons(port);
 +
 +      if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
 +              close(sockfd);
 +              return 0;
 +      }
  
 +      *socklist_p = malloc(sizeof(int));
 +      if ( !*socklist_p )
 +              die("memory allocation failed: %s", strerror(errno));
 +      **socklist_p = sockfd;
 +}
 +
 +#endif
 +
 +static int service_loop(int socknum, int *socklist)
 +{
 +      struct pollfd *pfd;
 +      int i;
 +
 +      pfd = calloc(socknum, sizeof(struct pollfd));
 +      if (!pfd)
 +              die("memory allocation failed: %s", strerror(errno));
 +
 +      for (i = 0; i < socknum; i++) {
 +              pfd[i].fd = socklist[i];
 +              pfd[i].events = POLLIN;
 +      }
 +      
        for (;;) {
                int i;
 -              fds = fds_init;
 -              
 -              if (select(maxfd + 1, &fds, NULL, NULL, NULL) < 0) {
 +
 +              if (poll(pfd, socknum, 0) < 0) {
                        if (errno != EINTR) {
 -                              error("select failed, resuming: %s",
 +                              error("poll failed, resuming: %s",
                                      strerror(errno));
                                sleep(1);
                        }
                }
  
                for (i = 0; i < socknum; i++) {
 -                      int sockfd = socklist[i];
 -
 -                      if (FD_ISSET(sockfd, &fds)) {
 +                      if (pfd[i].revents & POLLIN) {
                                struct sockaddr_storage ss;
                                int sslen = sizeof(ss);
 -                              int incoming = accept(sockfd, (struct sockaddr *)&ss, &sslen);
 +                              int incoming = accept(pfd[i].fd, (struct sockaddr *)&ss, &sslen);
                                if (incoming < 0) {
                                        switch (errno) {
                                        case EAGAIN:
        }
  }
  
 +static int serve(int port)
 +{
 +      int socknum, *socklist;
 +      
 +      signal(SIGCHLD, child_handler);
 +      
 +      socknum = socksetup(port, &socklist);
 +      if (socknum == 0)
 +              die("unable to allocate any listen sockets on port %u", port);
 +      
 +      return service_loop(socknum, socklist);
 +}     
 +
  int main(int argc, char **argv)
  {
        int port = DEFAULT_GIT_PORT;
        if (inetd_mode) {
                fclose(stderr); //FIXME: workaround
                return execute();
 +      } else {
 +              return serve(port);
        }
 -
 -      return serve(port);
  }