emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] netsec adff0d5 1/4: Refactor getaddrinfo usage


From: Robert Pluim
Subject: [Emacs-diffs] netsec adff0d5 1/4: Refactor getaddrinfo usage
Date: Tue, 17 Jul 2018 14:05:25 -0400 (EDT)

branch: netsec
commit adff0d5f75d4b3a74816527edb9ebe997c2089f3
Author: Robert Pluim <address@hidden>
Commit: Robert Pluim <address@hidden>

    Refactor getaddrinfo usage
    
    * src/process.c:
    (network_lookup_address_info_1): New function, does most of the
    work to call getaddrinfo.  Now checks hostname for pure-ASCII.
    (Fmake_network_process): Use it.
    (Fnetwork_lookup_address_info): Likewise.  Error check family
    argument.
---
 src/process.c | 84 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 50 insertions(+), 34 deletions(-)

diff --git a/src/process.c b/src/process.c
index 2025398..25f02af 100644
--- a/src/process.c
+++ b/src/process.c
@@ -276,6 +276,10 @@ static int read_process_output (Lisp_Object, int);
 static void create_pty (Lisp_Object);
 static void exec_sentinel (Lisp_Object, Lisp_Object);
 
+static Lisp_Object
+network_lookup_address_info_1 (Lisp_Object host, const char *service,
+                               struct addrinfo *hints, struct addrinfo **res);
+
 /* Number of bits set in connect_wait_mask.  */
 static int num_pending_connects;
 
@@ -4064,7 +4068,7 @@ usage: (make-network-process &rest ARGS)  */)
   if (!NILP (host))
     {
       struct addrinfo *res, *lres;
-      int ret;
+      Lisp_Object msg;
 
       maybe_quit ();
 
@@ -4073,20 +4077,11 @@ usage: (make-network-process &rest ARGS)  */)
       hints.ai_family = family;
       hints.ai_socktype = socktype;
 
-      ret = getaddrinfo (SSDATA (host), portstring, &hints, &res);
-      if (ret)
-#ifdef HAVE_GAI_STRERROR
-       {
-         synchronize_system_messages_locale ();
-         char const *str = gai_strerror (ret);
-         if (! NILP (Vlocale_coding_system))
-           str = SSDATA (code_convert_string_norecord
-                         (build_string (str), Vlocale_coding_system, 0));
-         error ("%s/%s %s", SSDATA (host), portstring, str);
-       }
-#else
-       error ("%s/%s getaddrinfo error %d", SSDATA (host), portstring, ret);
-#endif
+      msg = network_lookup_address_info_1 (host, portstring, &hints, &res);
+      if (!EQ(msg, Qt))
+        {
+          error ("%s", SSDATA (msg));
+        }
 
       for (lres = res; lres; lres = lres->ai_next)
        addrinfos = Fcons (conv_addrinfo_to_lisp (lres), addrinfos);
@@ -4535,6 +4530,37 @@ Data that is unavailable is returned as nil.  */)
 #endif
 }
 
+static Lisp_Object
+network_lookup_address_info_1 (Lisp_Object host, const char *service,
+                               struct addrinfo *hints, struct addrinfo **res)
+{
+  Lisp_Object msg = Qt;
+  int ret;
+
+  if (SBYTES (host) != SCHARS (host))
+    error ("Non-ASCII hostname %s detected, please use puny-encode-domain",
+           SSDATA (host));
+  ret = getaddrinfo (SSDATA (host), service, hints, res);
+  if (ret)
+    {
+      if (service == NULL)
+        service = "0";
+#ifdef HAVE_GAI_STRERROR
+      synchronize_system_messages_locale ();
+      char const *str = gai_strerror (ret);
+      if (! NILP (Vlocale_coding_system))
+        str = SSDATA (code_convert_string_norecord
+                      (build_string (str), Vlocale_coding_system, 0));
+      AUTO_STRING (format, "%s/%s %s");
+      msg = CALLN (Fformat, format, host, build_string (service), build_string 
(str));
+#else
+      AUTO_STRING (format, "%s/%s getaddrinfo error %d");
+      msg = CALLN (Fformat, format, host, build_string (service), make_number 
(ret));
+#endif
+    }
+   return msg;
+}
+
 DEFUN ("network-lookup-address-info", Fnetwork_lookup_address_info,
        Snetwork_lookup_address_info, 1, 2, 0,
        doc: /* Look up ip address info of NAME.
@@ -4545,42 +4571,32 @@ nil if none were found.  Each address is a vector of 
integers.  */)
      (Lisp_Object name, Lisp_Object family)
 {
   Lisp_Object addresses = Qnil;
-  struct addrinfo *res, *lres;
-  int ret;
+  Lisp_Object msg = Qnil;
 
+  struct addrinfo *res, *lres;
   struct addrinfo hints;
 
-  if (STRING_MULTIBYTE (name))
-    error ("Non-ASCII hostname \"%s\" detected, please use puny-encode-string",
-           SSDATA (name));
   memset (&hints, 0, sizeof hints);
   if (EQ (family, Qnil))
     hints.ai_family = AF_UNSPEC;
-  if (EQ (family, Qipv4))
+  else if (EQ (family, Qipv4))
     hints.ai_family = AF_INET;
-  if (EQ (family, Qipv6))
+  else if (EQ (family, Qipv6))
 #ifdef AF_INET6
     hints.ai_family = AF_INET6;
 #else
   /* If we don't support IPv6, querying will never work anyway */
     return addresses;
 #endif
+  else
+    error ("Unsupported lookup type");
   hints.ai_socktype = SOCK_DGRAM;
 
-  ret = getaddrinfo (SSDATA (name), NULL, &hints, &res);
-  if (ret)
-#ifdef HAVE_GAI_STRERROR
+  msg = network_lookup_address_info_1 (name, NULL, &hints, &res);
+  if (!EQ(msg, Qt))
     {
-      synchronize_system_messages_locale ();
-      char const *str = gai_strerror (ret);
-      if (! NILP (Vlocale_coding_system))
-        str = SSDATA (code_convert_string_norecord
-                      (build_string (str), Vlocale_coding_system, 0));
-      message ("\"%s\" \"%s\"", SSDATA (name), str);
+      message ("%s", SSDATA(msg));
     }
-#else
-      message ("%s network-lookup-address-info error %d", SSDATA (name), ret);
-#endif
   else
     {
       for (lres = res; lres; lres = lres->ai_next)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]