Code

Merge branch 'ew/keepalive' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 28 Dec 2011 19:32:36 +0000 (11:32 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 28 Dec 2011 19:32:36 +0000 (11:32 -0800)
* ew/keepalive:
  enable SO_KEEPALIVE for connected TCP sockets

1  2 
connect.c

diff --combined connect.c
index 51990fa0cb300a95b125b0727f10133961d0167b,d725b1794f4a6d272a0cc649f57d99453255f8cc..d0f59ef0deebff3967c0b054f2f998dfb3ab5b00
+++ b/connect.c
@@@ -22,7 -22,7 +22,7 @@@ static int check_ref(const char *name, 
        len -= 5;
  
        /* REF_NORMAL means that we don't want the magic fake tag refs */
 -      if ((flags & REF_NORMAL) && check_ref_format(name) < 0)
 +      if ((flags & REF_NORMAL) && check_refname_format(name, 0))
                return 0;
  
        /* REF_HEADS means that we want regular branch heads */
@@@ -175,6 -175,15 +175,15 @@@ static void get_host_and_port(char **ho
        }
  }
  
+ static void enable_keepalive(int sockfd)
+ {
+       int ka = 1;
+       if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &ka, sizeof(ka)) < 0)
+               fprintf(stderr, "unable to set SO_KEEPALIVE on socket: %s\n",
+                       strerror(errno));
+ }
  #ifndef NO_IPV6
  
  static const char *ai_name(const struct addrinfo *ai)
@@@ -239,6 -248,8 +248,8 @@@ static int git_tcp_connect_sock(char *h
        if (sockfd < 0)
                die("unable to connect to %s:\n%s", host, error_message.buf);
  
+       enable_keepalive(sockfd);
        if (flags & CONNECT_VERBOSE)
                fprintf(stderr, "done.\n");
  
   */
  static int git_tcp_connect_sock(char *host, int flags)
  {
 -      int sockfd = -1, saved_errno = 0;
 +      struct strbuf error_message = STRBUF_INIT;
 +      int sockfd = -1;
        const char *port = STR(DEFAULT_GIT_PORT);
        char *ep;
        struct hostent *he;
                fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
  
        for (cnt = 0, ap = he->h_addr_list; *ap; ap++, cnt++) {
 -              sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
 -              if (sockfd < 0) {
 -                      saved_errno = errno;
 -                      continue;
 -              }
 -
                memset(&sa, 0, sizeof sa);
                sa.sin_family = he->h_addrtype;
                sa.sin_port = htons(nport);
                memcpy(&sa.sin_addr, *ap, he->h_length);
  
 -              if (connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
 -                      saved_errno = errno;
 -                      fprintf(stderr, "%s[%d: %s]: errno=%s\n",
 +              sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
 +              if ((sockfd < 0) ||
 +                  connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
 +                      strbuf_addf(&error_message, "%s[%d: %s]: errno=%s\n",
                                host,
                                cnt,
                                inet_ntoa(*(struct in_addr *)&sa.sin_addr),
 -                              strerror(saved_errno));
 -                      close(sockfd);
 +                              strerror(errno));
 +                      if (0 <= sockfd)
 +                              close(sockfd);
                        sockfd = -1;
                        continue;
                }
        }
  
        if (sockfd < 0)
 -              die("unable to connect a socket (%s)", strerror(saved_errno));
 +              die("unable to connect to %s:\n%s", host, error_message.buf);
  
+       enable_keepalive(sockfd);
        if (flags & CONNECT_VERBOSE)
                fprintf(stderr, "done.\n");