Skip to content

Commit

Permalink
ident.c: 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: Elia Pinto <gitter.spiros@gmail.com>
Helped-by: Jeff King <peff@peff.net>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Jeff King <peff@peff.net>
  • Loading branch information
Elia Pinto authored and Jeff King committed Nov 28, 2015
1 parent b05c2f9 commit 00bce77
Showing 1 changed file with 27 additions and 4 deletions.
31 changes: 27 additions & 4 deletions ident.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,35 @@ static int add_mailname_host(struct strbuf *buf)
return 0;
}

static int canonical_name(const char *host, struct strbuf *out)
{
int status = -1;

#ifndef NO_IPV6
struct addrinfo hints, *ai;
memset (&hints, '\0', sizeof (hints));
hints.ai_flags = AI_CANONNAME;
if (!getaddrinfo(host, NULL, &hints, &ai)) {
if (ai && strchr(ai->ai_canonname, '.')) {
strbuf_addstr(out, ai->ai_canonname);
status = 0;
}
freeaddrinfo(ai);
}
#else
struct hostent *he = gethostbyname(buf);
if (he && strchr(he->h_name, '.')) {
strbuf_addstr(out, he->h_name);
status = 0;
}
#endif /* NO_IPV6 */

return status;
}

static void add_domainname(struct strbuf *out)
{
char buf[1024];
struct hostent *he;

if (gethostname(buf, sizeof(buf))) {
warning("cannot get host name: %s", strerror(errno));
Expand All @@ -82,9 +107,7 @@ static void add_domainname(struct strbuf *out)
}
if (strchr(buf, '.'))
strbuf_addstr(out, buf);
else if ((he = gethostbyname(buf)) && strchr(he->h_name, '.'))
strbuf_addstr(out, he->h_name);
else
else if (canonical_name(buf, out) < 0)
strbuf_addf(out, "%s.(none)", buf);
}

Expand Down

0 comments on commit 00bce77

Please sign in to comment.