Skip to content

Commit

Permalink
imap-send: add support for IPv6
Browse files Browse the repository at this point in the history
Add IPv6 support by implementing name resolution with the
protocol agnostic getaddrinfo(3) API. The old gethostbyname(3)
code is still available when git is compiled with NO_IPV6.

Signed-off-by: Benjamin Kramer <benny.kra@googlemail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Benjamin Kramer authored and Junio C Hamano committed May 27, 2009
1 parent 33fd716 commit 94ad243
Showing 1 changed file with 51 additions and 3 deletions.
54 changes: 51 additions & 3 deletions imap-send.c
Original file line number Diff line number Diff line change
Expand Up @@ -982,9 +982,7 @@ static struct store *imap_open_store(struct imap_server_conf *srvc)
struct imap_store *ctx;
struct imap *imap;
char *arg, *rsp;
struct hostent *he;
struct sockaddr_in addr;
int s, a[2], preauth;
int s = -1, a[2], preauth;
pid_t pid;

ctx = xcalloc(sizeof(*ctx), 1);
Expand Down Expand Up @@ -1021,6 +1019,51 @@ static struct store *imap_open_store(struct imap_server_conf *srvc)

imap_info("ok\n");
} else {
#ifndef NO_IPV6
struct addrinfo hints, *ai0, *ai;
int gai;
char portstr[6];

snprintf(portstr, sizeof(portstr), "%hu", srvc->port);

memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

imap_info("Resolving %s... ", srvc->host);
gai = getaddrinfo(srvc->host, portstr, &hints, &ai);
if (gai) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai));
goto bail;
}
imap_info("ok\n");

for (ai0 = ai; ai; ai = ai->ai_next) {
char addr[NI_MAXHOST];

s = socket(ai->ai_family, ai->ai_socktype,
ai->ai_protocol);
if (s < 0)
continue;

getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
sizeof(addr), NULL, 0, NI_NUMERICHOST);
imap_info("Connecting to [%s]:%s... ", addr, portstr);

if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) {
close(s);
s = -1;
perror("connect");
continue;
}

break;
}
freeaddrinfo(ai0);
#else /* NO_IPV6 */
struct hostent *he;
struct sockaddr_in addr;

memset(&addr, 0, sizeof(addr));
addr.sin_port = htons(srvc->port);
addr.sin_family = AF_INET;
Expand All @@ -1040,7 +1083,12 @@ static struct store *imap_open_store(struct imap_server_conf *srvc)
imap_info("Connecting to %s:%hu... ", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
if (connect(s, (struct sockaddr *)&addr, sizeof(addr))) {
close(s);
s = -1;
perror("connect");
}
#endif
if (s < 0) {
fputs("Error: unable to connect to server.\n", stderr);
goto bail;
}

Expand Down

0 comments on commit 94ad243

Please sign in to comment.