summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-12-15 09:42:01 -0800
committerJunio C Hamano <gitster@pobox.com>2015-12-15 09:42:01 -0800
commitde301c5c85b333751a21b3d6b8cff566dc31e6c9 (patch)
tree05be77a4c0a57220506738d04d03699e2c7f76f4
parentf97f2e5c645759ec3204ca99cbc5f61caf9201de (diff)
parent58d29ececf8fc287d9b244c617edd174ded66b01 (diff)
downloadgit-de301c5c85b333751a21b3d6b8cff566dc31e6c9.tar.gz
Merge branch 'ep/ident-with-getaddrinfo' into maint
A fix-up for recent topic. * ep/ident-with-getaddrinfo: ident: fix undefined variable when NO_IPV6 is set ident.c: add support for IPv6
-rw-r--r--ident.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/ident.c b/ident.c
index 5ff1aadaaa..00a62e0c42 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(host);
+ 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);
}