зеркало из https://github.com/microsoft/git.git
Verbose connect messages to show the IP addresses used
Also, the patch makes the error messages more verbose. Helps when diagnosing connect problems on weird systems. Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
18bece4367
Коммит
ba505322a4
38
connect.c
38
connect.c
|
@ -391,6 +391,23 @@ static enum protocol get_protocol(const char *name)
|
|||
|
||||
#ifndef NO_IPV6
|
||||
|
||||
static const char *ai_name(const struct addrinfo *ai)
|
||||
{
|
||||
static char addr[INET_ADDRSTRLEN];
|
||||
if ( AF_INET == ai->ai_family ) {
|
||||
struct sockaddr_in *in;
|
||||
in = (struct sockaddr_in *)ai->ai_addr;
|
||||
inet_ntop(ai->ai_family, &in->sin_addr, addr, sizeof(addr));
|
||||
} else if ( AF_INET6 == ai->ai_family ) {
|
||||
struct sockaddr_in6 *in;
|
||||
in = (struct sockaddr_in6 *)ai->ai_addr;
|
||||
inet_ntop(ai->ai_family, &in->sin6_addr, addr, sizeof(addr));
|
||||
} else {
|
||||
strcpy(addr, "(unknown)");
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a connected socket() fd, or else die()s.
|
||||
*/
|
||||
|
@ -401,6 +418,7 @@ static int git_tcp_connect_sock(char *host, int flags)
|
|||
const char *port = STR(DEFAULT_GIT_PORT);
|
||||
struct addrinfo hints, *ai0, *ai;
|
||||
int gai;
|
||||
int cnt = 0;
|
||||
|
||||
if (host[0] == '[') {
|
||||
end = strchr(host + 1, ']');
|
||||
|
@ -444,10 +462,18 @@ static int git_tcp_connect_sock(char *host, int flags)
|
|||
}
|
||||
if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||
saved_errno = errno;
|
||||
fprintf(stderr, "%s[%d: %s]: net=%s, errno=%s\n",
|
||||
host,
|
||||
cnt,
|
||||
ai_name(ai),
|
||||
hstrerror(h_errno),
|
||||
strerror(saved_errno));
|
||||
close(sockfd);
|
||||
sockfd = -1;
|
||||
continue;
|
||||
}
|
||||
if (flags & CONNECT_VERBOSE)
|
||||
fprintf(stderr, "%s ", ai_name(ai));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -476,6 +502,7 @@ static int git_tcp_connect_sock(char *host, int flags)
|
|||
struct sockaddr_in sa;
|
||||
char **ap;
|
||||
unsigned int nport;
|
||||
int cnt;
|
||||
|
||||
if (host[0] == '[') {
|
||||
end = strchr(host + 1, ']');
|
||||
|
@ -512,7 +539,7 @@ static int git_tcp_connect_sock(char *host, int flags)
|
|||
if (flags & CONNECT_VERBOSE)
|
||||
fprintf(stderr, "done.\nConnecting to %s (port %s) ... ", host, port);
|
||||
|
||||
for (ap = he->h_addr_list; *ap; ap++) {
|
||||
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;
|
||||
|
@ -526,10 +553,19 @@ static int git_tcp_connect_sock(char *host, int flags)
|
|||
|
||||
if (connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
|
||||
saved_errno = errno;
|
||||
fprintf(stderr, "%s[%d: %s]: net=%s, errno=%s\n",
|
||||
host,
|
||||
cnt,
|
||||
inet_ntoa(*(struct in_addr *)&sa.sin_addr),
|
||||
hstrerror(h_errno),
|
||||
strerror(saved_errno));
|
||||
close(sockfd);
|
||||
sockfd = -1;
|
||||
continue;
|
||||
}
|
||||
if (flags & CONNECT_VERBOSE)
|
||||
fprintf(stderr, "%s ",
|
||||
inet_ntoa(*(struct in_addr *)&sa.sin_addr));
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче