]> git.eshelyaron.com Git - emacs.git/commitdiff
(init_system_name): Use getaddrinfo if available.
authorJan Djärv <jan.h.d@swipnet.se>
Sun, 18 Nov 2007 17:34:03 +0000 (17:34 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Sun, 18 Nov 2007 17:34:03 +0000 (17:34 +0000)
src/ChangeLog
src/sysdep.c

index 04fa6aa9357de787de989e260b64b0b12a80ca42..cf1c42f73c943d120a37f86597cb9653c6bd79a6 100644 (file)
@@ -1,5 +1,7 @@
 2007-11-18  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
+       * sysdep.c (init_system_name): Use getaddrinfo if available.
+
        * xterm.c (x_scroll_bar_set_handle, x_scroll_bar_handle_click)
        (x_scroll_bar_note_movement): start, end, with, height in struct
        scroll_bar are integers and not Lisp_Object, so remove XINT for them.
index 35a107f34cf0697894b0d3fdc515205658f97df7..81850919dd3a4d207420a96515da7754e9538c99 100644 (file)
@@ -2518,10 +2518,50 @@ init_system_name ()
 #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 @@ init_system_name ()
 #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 @@ init_system_name ()
              }
 #endif
          }
+#endif /* !HAVE_GETADDRINFO */
       }
 #endif /* HAVE_SOCKETS */
   /* We used to try using getdomainname here,