From: H. Peter Anvin Date: Fri, 30 Sep 2005 17:44:21 +0000 (-0700) Subject: Merge with master.kernel.org:/pub/scm/git/git.git X-Git-Tag: v0.99.9~211 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/300b4801b75a59961e66ad9fa96941e46fd76be5?ds=inline;hp=-c Merge with master.kernel.org:/pub/scm/git/git.git --- 300b4801b75a59961e66ad9fa96941e46fd76be5 diff --combined Makefile index 1f4f31b53b,e943954cf8..8b152dd558 --- a/Makefile +++ 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 526ac782cf,65e62d7bb1..8366a33bcb --- a/daemon.c +++ b/daemon.c @@@ -1,11 -1,9 +1,11 @@@ #include "cache.h" #include "pkt-line.h" +#include #include #include #include #include +#include #include #include #include @@@ -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; @@@ -340,7 -337,6 +340,7 @@@ 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)); @@@ -395,6 -391,8 +395,6 @@@ 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; @@@ -433,65 -431,23 +433,65 @@@ 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); } @@@ -499,10 -455,12 +499,10 @@@ } 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: @@@ -519,19 -477,6 +519,19 @@@ } } +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; @@@ -581,7 -526,7 +581,7 @@@ if (inetd_mode) { fclose(stderr); //FIXME: workaround return execute(); + } else { + return serve(port); } - - return serve(port); }