- {
- struct hostent *hp = NULL;
- int count;
-# ifdef TRY_AGAIN
- for (count = 0; count < 10; count++)
- {
- h_errno = 0;
-# endif
- /* Some systems can't handle SIGALARM/SIGIO in gethostbyname(). */
- stop_interrupts ();
- hp = gethostbyname (hostname);
- start_interrupts ();
-# ifdef TRY_AGAIN
- if (! (hp == 0 && h_errno == TRY_AGAIN))
- break;
- Fsleep_for (make_int (1));
- }
-# endif
- if (hp)
- {
- CONST char *fqdn = (CONST char *) hp->h_name;
-
- if (!strchr (fqdn, '.'))
- {
- /* We still don't have a fully qualified domain name.
- Try to find one in the list of alternate names */
- char **alias = hp->h_aliases;
- while (*alias && !strchr (*alias, '.'))
- alias++;
- if (*alias)
- fqdn = *alias;
- }
- hostname = (char *) alloca (strlen (fqdn) + 1);
- strcpy (hostname, fqdn);
- }
- }
+ if (!strchr (hostname, '.'))
+ {
+# if !(defined(HAVE_GETADDRINFO) && defined(HAVE_GETNAMEINFO))
+ struct hostent *hp = NULL;
+ int count;
+# ifdef TRY_AGAIN
+ for (count = 0; count < 10; count++)
+ {
+ h_errno = 0;
+# endif
+ /* Some systems can't handle SIGALARM/SIGIO in gethostbyname(). */
+ stop_interrupts ();
+ hp = gethostbyname (hostname);
+ start_interrupts ();
+# ifdef TRY_AGAIN
+ if (! (hp == 0 && h_errno == TRY_AGAIN))
+ break;
+ Fsleep_for (make_int (1));
+ }
+# endif
+ if (hp)
+ {
+ const char *fqdn = (const char *) hp->h_name;
+
+ if (!strchr (fqdn, '.'))
+ {
+ /* We still don't have a fully qualified domain name.
+ Try to find one in the list of alternate names */
+ char **alias = hp->h_aliases;
+ while (*alias && !strchr (*alias, '.'))
+ alias++;
+ if (*alias)
+ fqdn = *alias;
+ }
+ hostname = (char *) alloca (strlen (fqdn) + 1);
+ strcpy (hostname, fqdn);
+ }
+# else /* !(HAVE_GETADDRINFO && HAVE_GETNAMEINFO) */
+ struct addrinfo hints, *res;
+
+ xzero (hints);
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = 0;
+ if (!getaddrinfo (hostname, NULL, &hints, &res))
+ {
+ hostname = (char *) alloca (strlen (res->ai_canonname) + 1);
+ strcpy (hostname, res->ai_canonname);
+
+ freeaddrinfo (res);
+ }
+# endif /* !(HAVE_GETADDRINFO && HAVE_GETNAMEINFO) */
+ }