Mercurial > emacs
changeset 86212:777f1d31b403
(init_system_name): Use getaddrinfo if available.
author | Jan Djärv <jan.h.d@swipnet.se> |
---|---|
date | Sun, 18 Nov 2007 17:33:55 +0000 |
parents | 28ea5d5d04ca |
children | cecb01deb2a2 |
files | src/sysdep.c |
diffstat | 1 files changed, 45 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/sysdep.c Sun Nov 18 17:24:37 2007 +0000 +++ b/src/sysdep.c Sun Nov 18 17:33:55 2007 +0000 @@ -2518,10 +2518,50 @@ #endif /* not CANNOT_DUMP */ if (! index (hostname, '.')) { - struct hostent *hp; int count; +#ifdef HAVE_GETADDRINFO + struct addrinfo *res; + struct addrinfo hints; + int ret; + + memset (&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + for (count = 0;; count++) { + if ((ret = getaddrinfo (hostname, NULL, &hints, &res)) == 0 + || ret != EAI_AGAIN) + break; + + if (count >= 5) + break; + Fsleep_for (make_number (1), Qnil); + } + + if (ret == 0) + { + struct addrinfo *it = res; + while (it) + { + char *fqdn = it->ai_canonname; + if (fqdn && index (fqdn, '.') + && strcmp (fqdn, "localhost.localdomain") != 0) + break; + it = it->ai_next; + } + if (it) + { + hostname = alloca (strlen (it->ai_canonname) + 1); + strcpy (hostname, it->ai_canonname); + } + freeaddrinfo (res); + } +#else /* !HAVE_GETADDRINFO */ + struct hostent *hp; + for (count = 0;; count++) + { + #ifdef TRY_AGAIN h_errno = 0; #endif @@ -2529,11 +2569,14 @@ #ifdef TRY_AGAIN if (! (hp == 0 && h_errno == TRY_AGAIN)) #endif + break; + if (count >= 5) break; Fsleep_for (make_number (1), Qnil); } + if (hp) { char *fqdn = (char *) hp->h_name; @@ -2567,6 +2610,7 @@ } #endif } +#endif /* !HAVE_GETADDRINFO */ } #endif /* HAVE_SOCKETS */ /* We used to try using getdomainname here,