# HG changeset patch # User Jan Dj¸«£rv # Date 1195407235 0 # Node ID 777f1d31b403e117327337b20eca08de8efadf9c # Parent 28ea5d5d04cab3c6e0852a5b7d8c709ebb0af664 (init_system_name): Use getaddrinfo if available. diff -r 28ea5d5d04ca -r 777f1d31b403 src/sysdep.c --- 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,