]> git.eshelyaron.com Git - emacs.git/commitdiff
Remove redundant code in connect_network_socket
authorEli Zaretskii <eliz@gnu.org>
Wed, 17 May 2017 15:12:58 +0000 (18:12 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 17 May 2017 15:12:58 +0000 (18:12 +0300)
* src/process.c (connect_network_socket) [HAVE_GETSOCKNAME]:
Remove redundant type-casting and variables.  Don't call
'getsockname' to find the port for AF_LOCAL sockets.
[AF_INET6]: Add an assertion to verify that the ports in the IPv4
and IPv6 structures are at the same offset and have the same size.

src/process.c

index fdea97722f288619ade3b48bedcf5823e62c237f..ecb1b0ca6df9365de84048ef5e6df398e80801be 100644 (file)
@@ -3418,34 +3418,31 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
            report_file_error ("Cannot bind server socket", Qnil);
 
 #ifdef HAVE_GETSOCKNAME
-         if (p->port == 0)
+         if (p->port == 0
+#ifdef HAVE_LOCAL_SOCKETS
+             && family != AF_LOCAL
+#endif
+             )
            {
-             struct sockaddr_storage sa1;
+             struct sockaddr_in sa1;
              socklen_t len1 = sizeof (sa1);
+#ifdef AF_INET6
+             /* The code below assumes the port is at the same offset
+                and of the same width in both IPv4 and IPv6
+                structures, but the standards don't guarantee that,
+                so we have this assertion to make sure.  */
+             eassert ((offsetof (struct sockaddr_in, sin_port)
+                       == offsetof (struct sockaddr_in6, sin6_port))
+                      && (sizeof (sa1.sin_port)
+                          == sizeof (((struct sockaddr_in6 *) &sa1)->sin6_port)));
+#endif
              if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
                {
+                 Lisp_Object service = make_number (ntohs (sa1.sin_port));
+                 contact = Fplist_put (contact, QCservice, service);
                  /* Save the port number so that we can stash it in
                     the process object later.  */
-                 int port = -1;
-                 switch (family)
-                   {
-                   case AF_INET:
-                     ((struct sockaddr_in *) sa)->sin_port
-                       = port = ((struct sockaddr_in *) &sa1)->sin_port;
-                     break;
-# ifdef AF_INET6
-                   case AF_INET6:
-                     ((struct sockaddr_in6 *) sa)->sin6_port
-                       = port = ((struct sockaddr_in6 *) &sa1)->sin6_port;
-                     break;
-# endif
-                   }
-
-                 if (0 <= port)
-                   {
-                     Lisp_Object service = make_number (ntohs (port));
-                     contact = Fplist_put (contact, QCservice, service);
-                   }
+                 ((struct sockaddr_in *) sa)->sin_port = sa1.sin_port;
                }
            }
 #endif