ident: use full dns names to generate email addresses
authorJeff King <peff@peff.net>
Mon, 21 May 2012 23:10:23 +0000 (19:10 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 22 May 2012 16:08:46 +0000 (09:08 -0700)
When we construct an email address from the username and
hostname, we generate the host part of the email with this
procedure:

  1. add the result of gethostname

  2. if it has a dot, ok, it's fully qualified

  3. if not, then look up the unqualified hostname via
     gethostbyname; take the domain name of the result and
     append it to the hostname

Step 3 can actually produce a bogus result, as the name
returned by gethostbyname may not be related to the hostname
we fed it (e.g., consider a machine "foo" with names
"foo.one.example.com" and "bar.two.example.com"; we may have
the latter returned and generate the bogus name
"foo.two.example.com").

This patch simply uses the full hostname returned by
gethostbyname. In the common case that the first part is the
same as the unqualified hostname, the behavior is identical.
And in the case that it is not the same, we are much more
likely to be generating a valid name.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
ident.c

diff --git a/ident.c b/ident.c
index 5aec073b96165654dc5ea88b0a08798fe4ada0e7..b111e34140656545bf4484aa5428d6e39ca4a7d1 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -65,23 +65,18 @@ static void add_domainname(struct strbuf *out)
 {
        char buf[1024];
        struct hostent *he;
-       const char *domainname;
 
        if (gethostname(buf, sizeof(buf))) {
                warning("cannot get host name: %s", strerror(errno));
                strbuf_addstr(out, "(none)");
                return;
        }
-       strbuf_addstr(out, buf);
        if (strchr(buf, '.'))
-               return;
-
-       he = gethostbyname(buf);
-       strbuf_addch(out, '.');
-       if (he && (domainname = strchr(he->h_name, '.')))
-               strbuf_addstr(out, domainname + 1);
+               strbuf_addstr(out, buf);
+       else if ((he = gethostbyname(buf)) && strchr(he->h_name, '.'))
+               strbuf_addstr(out, he->h_name);
        else
-               strbuf_addstr(out, "(none)");
+               strbuf_addf(out, "%s.(none)", buf);
 }
 
 static void copy_email(const struct passwd *pw, struct strbuf *email)