aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wooding <mdw@distorted.org.uk>2006-02-03 20:27:04 +0000
committerJunio C Hamano <junkio@cox.net>2006-02-05 16:51:01 -0800
commit1955fabf4194f3629e028778d0081bb2aa16c06c (patch)
tree90a5ff5609a0be0c7316b30b1580e9f36add5bf0
parent363f24c93695d26f5af584e99093689077b1c7dd (diff)
downloadgit-1955fabf4194f3629e028778d0081bb2aa16c06c.tar.gz
git-1955fabf4194f3629e028778d0081bb2aa16c06c.tar.xz
daemon: Set SO_REUSEADDR on listening sockets.
Without this, you can silently lose the ability to receive IPv4 connections if you stop and restart the daemon. [jc: tweaked code organization a bit and made this controllable from a command line option.] Signed-off-by: Mark Wooding <mdw@distorted.org.uk> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--daemon.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/daemon.c b/daemon.c
index 324bb04da..dab8c2c64 100644
--- a/daemon.c
+++ b/daemon.c
@@ -13,11 +13,12 @@
static int log_syslog;
static int verbose;
+static int reuseaddr;
static const char daemon_usage[] =
"git-daemon [--verbose] [--syslog] [--inetd | --port=n] [--export-all]\n"
" [--timeout=n] [--init-timeout=n] [--strict-paths]\n"
-" [--base-path=path] [directory...]";
+" [--base-path=path] [--reuseaddr] [directory...]";
/* List of acceptable pathname prefixes */
static char **ok_paths = NULL;
@@ -451,6 +452,16 @@ static void child_handler(int signo)
}
}
+static int set_reuse_addr(int sockfd)
+{
+ int on = 1;
+
+ if (!reuseaddr)
+ return 0;
+ return setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
+ &on, sizeof(on));
+}
+
#ifndef NO_IPV6
static int socksetup(int port, int **socklist_p)
@@ -495,6 +506,11 @@ static int socksetup(int port, int **socklist_p)
}
#endif
+ if (set_reuse_addr(sockfd)) {
+ close(sockfd);
+ return 0; /* not fatal */
+ }
+
if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
close(sockfd);
continue; /* not fatal */
@@ -537,6 +553,11 @@ static int socksetup(int port, int **socklist_p)
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);
+ if (set_reuse_addr(sockfd)) {
+ close(sockfd);
+ return 0;
+ }
+
if ( bind(sockfd, (struct sockaddr *)&sin, sizeof sin) < 0 ) {
close(sockfd);
return 0;
@@ -663,6 +684,10 @@ int main(int argc, char **argv)
base_path = arg+12;
continue;
}
+ if (!strcmp(arg, "--reuseaddr")) {
+ reuseaddr = 1;
+ continue;
+ }
if (!strcmp(arg, "--")) {
ok_paths = &argv[i+1];
break;