Cygwin doesn't support IPv6 or getaddrinfo()
This commit is contained in:
parent
1775451793
commit
4c505f71e6
73
connect.c
73
connect.c
@ -290,6 +290,8 @@ static enum protocol get_protocol(const char *name)
|
|||||||
#define STR_(s) # s
|
#define STR_(s) # s
|
||||||
#define STR(s) STR_(s)
|
#define STR(s) STR_(s)
|
||||||
|
|
||||||
|
#ifndef __CYGWIN__
|
||||||
|
|
||||||
static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
|
static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
|
||||||
{
|
{
|
||||||
int sockfd = -1;
|
int sockfd = -1;
|
||||||
@ -346,6 +348,77 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* __CYGWIN__ */
|
||||||
|
|
||||||
|
static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path)
|
||||||
|
{
|
||||||
|
int sockfd = -1;
|
||||||
|
char *colon, *end;
|
||||||
|
char *port = STR(DEFAULT_GIT_PORT), *ep;
|
||||||
|
struct hostent *he;
|
||||||
|
struct sockaddr_in sa;
|
||||||
|
char **ap;
|
||||||
|
unsigned int nport;
|
||||||
|
|
||||||
|
if (host[0] == '[') {
|
||||||
|
end = strchr(host + 1, ']');
|
||||||
|
if (end) {
|
||||||
|
*end = 0;
|
||||||
|
end++;
|
||||||
|
host++;
|
||||||
|
} else
|
||||||
|
end = host;
|
||||||
|
} else
|
||||||
|
end = host;
|
||||||
|
colon = strchr(end, ':');
|
||||||
|
|
||||||
|
if (colon) {
|
||||||
|
*colon = 0;
|
||||||
|
port = colon + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
he = gethostbyname(host);
|
||||||
|
if (!he)
|
||||||
|
die("Unable to look up %s (%s)", host, hstrerror(h_errno));
|
||||||
|
nport = strtoul(port, &ep, 10);
|
||||||
|
if ( ep == port || *ep ) {
|
||||||
|
/* Not numeric */
|
||||||
|
struct servent *se = getservbyname(port,"tcp");
|
||||||
|
if ( !se )
|
||||||
|
die("Unknown port %s\n", port);
|
||||||
|
nport = se->s_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ap = he->h_addr_list; *ap; ap++) {
|
||||||
|
sockfd = socket(he->h_addrtype, SOCK_STREAM, 0);
|
||||||
|
if (sockfd < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
memset(&sa, 0, sizeof sa);
|
||||||
|
sa.sin_family = he->h_addrtype;
|
||||||
|
sa.sin_port = nport;
|
||||||
|
memcpy(&sa.sin_addr, ap, he->h_length);
|
||||||
|
|
||||||
|
if (connect(sockfd, (struct sockaddr *)&sa, sizeof sa) < 0) {
|
||||||
|
close(sockfd);
|
||||||
|
sockfd = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sockfd < 0)
|
||||||
|
die("unable to connect a socket (%s)", strerror(errno));
|
||||||
|
|
||||||
|
fd[0] = sockfd;
|
||||||
|
fd[1] = sockfd;
|
||||||
|
packet_write(sockfd, "%s %s\n", prog, path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __CYGWIN__ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Yeah, yeah, fixme. Need to pass in the heads etc.
|
* Yeah, yeah, fixme. Need to pass in the heads etc.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user