diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-12-08 14:14:50 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-12-08 14:14:50 -0800 |
commit | 545299f82224c23978a7c72ae4b7ef1093cd836c (patch) | |
tree | c2562e85ff9a5c28c377161dba14cca4b54bbd74 | |
parent | 2b597f3307f2ae87e1213076db8dd59760317487 (diff) | |
parent | 00bce77fe5b30720f4031f048abf42517b0da0ba (diff) | |
download | git-545299f82224c23978a7c72ae4b7ef1093cd836c.tar.gz |
Merge branch 'ep/ident-with-getaddrinfo'
A build without NO_IPv6 used to use gethostbyname() when guessing
user's hostname, instead of getaddrinfo() that is used in other
codepaths in such a build.
* ep/ident-with-getaddrinfo:
ident.c: add support for IPv6
-rw-r--r-- | ident.c | 31 |
1 files changed, 27 insertions, 4 deletions
@@ -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); } |