summaryrefslogtreecommitdiff
path: root/ident.c
diff options
context:
space:
mode:
authorElia Pinto <gitter.spiros@gmail.com>2015-11-27 14:08:27 +0000
committerJeff King <peff@peff.net>2015-11-28 12:20:42 -0500
commit00bce77fe5b30720f4031f048abf42517b0da0ba (patch)
tree513090cc6f490120273d920a9d1cc2151bb3c29b /ident.c
parentb05c2f9ed48adfd9670b28ecdd5c55a4e4698704 (diff)
downloadgit-00bce77fe5b30720f4031f048abf42517b0da0ba.tar.gz
ident.c: add support for IPv6
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>
Diffstat (limited to 'ident.c')
-rw-r--r--ident.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/ident.c b/ident.c
index 5ff1aadaaa..4e7f99d5dd 100644
--- a/ident.c
+++ b/ident.c
@@ -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));
@@ -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);
}