]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
_dbus_append_address_from_socket: Factor out inet_sockaddr_to_string
authorSimon McVittie <smcv@collabora.com>
Thu, 8 Mar 2018 13:30:58 +0000 (13:30 +0000)
committerSimon McVittie <smcv@collabora.com>
Fri, 9 Mar 2018 12:27:04 +0000 (12:27 +0000)
Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Ralf Habacker <ralf.habacker@freenet.de>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=61922

dbus/dbus-sysdeps-unix.c
dbus/dbus-sysdeps.c
dbus/dbus-sysdeps.h

index d4f448a7872ba2aec5adf29596861237dacf73e7..d7f16fc76a30e50ccd1f752d36c50b2be1a14a8a 100644 (file)
@@ -4662,6 +4662,8 @@ _dbus_append_address_from_socket (DBusSocket  fd,
   char hostip[INET6_ADDRSTRLEN];
   socklen_t size = sizeof (socket);
   DBusString path_str;
+  const char *family_name = NULL;
+  dbus_uint16_t port;
 
   if (getsockname (fd.fd, &socket.sa, &size))
     goto err;
@@ -4701,10 +4703,17 @@ _dbus_append_address_from_socket (DBusSocket  fd,
       break;
 
     case AF_INET:
-      if (inet_ntop (AF_INET, &socket.ipv4.sin_addr, hostip, sizeof (hostip)))
+#ifdef AF_INET6
+    case AF_INET6:
+#endif
+       _dbus_string_init_const (&path_str, hostip);
+
+      if (_dbus_inet_sockaddr_to_string (&socket, size, hostip, sizeof (hostip),
+                                         &family_name, &port, error))
         {
-          if (_dbus_string_append_printf (address, "tcp:family=ipv4,host=%s,port=%u",
-                                          hostip, ntohs (socket.ipv4.sin_port)))
+          if (_dbus_string_append_printf (address, "tcp:family=%s,port=%u,host=",
+                                          family_name, port) &&
+              _dbus_address_append_escaped (address, &path_str))
             {
               return TRUE;
             }
@@ -4714,25 +4723,13 @@ _dbus_append_address_from_socket (DBusSocket  fd,
               return FALSE;
             }
         }
-      goto err;
-
-#ifdef AF_INET6
-    case AF_INET6:
-      _dbus_string_init_const (&path_str, hostip);
-      if (inet_ntop (AF_INET6, &socket.ipv6.sin6_addr, hostip, sizeof (hostip)))
+      else
         {
-          if (_dbus_string_append_printf (address, "tcp:family=ipv6,port=%u,host=",
-                                          ntohs (socket.ipv6.sin6_port)) &&
-              _dbus_address_append_escaped (address, &path_str))
-          else
-            {
-              _DBUS_SET_OOM (error);
-              return FALSE;
-            }
+          return FALSE;
         }
-      goto err;
+      /* not reached */
+      break;
 
-#endif
     default:
       dbus_set_error (error,
                       _dbus_error_from_errno (EINVAL),
index 20bb89441969e84ae30a313d329aa778d7f2cd8a..f15e556f34d500b85a3638c30d5e4a70ea75e95e 100644 (file)
 extern char **environ;
 #endif
 
+#ifdef DBUS_WIN
+#include "dbus-sockets-win.h"
+#else
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#endif
+
 /**
  * @defgroup DBusSysdeps Internal system-dependent API
  * @ingroup DBusInternals
@@ -773,6 +781,95 @@ _dbus_log (DBusSystemLogSeverity  severity,
   va_end (args);
 }
 
+/*
+ * Try to convert the IPv4 or IPv6 address pointed to by
+ * sockaddr_pointer into a string.
+ *
+ * @param sockaddr_pointer A struct sockaddr_in or struct sockaddr_in6
+ * @param len The length of the struct pointed to by sockaddr_pointer
+ * @param string An array to write the address into
+ * @param string_len Length of string (should usually be at least INET6_ADDRSTRLEN)
+ * @param family_name Used to return "ipv4" or "ipv6", or NULL to ignore
+ * @param port Used to return the port number, or NULL to ignore
+ * @returns #FALSE with errno set if the address family was not understood
+ */
+dbus_bool_t
+_dbus_inet_sockaddr_to_string (const void *sockaddr_pointer,
+                               size_t len,
+                               char *string,
+                               size_t string_len,
+                               const char **family_name,
+                               dbus_uint16_t *port,
+                               DBusError *error)
+{
+  union
+    {
+      struct sockaddr sa;
+      struct sockaddr_storage storage;
+      struct sockaddr_in ipv4;
+      struct sockaddr_in6 ipv6;
+    } addr;
+  int saved_errno;
+
+  if (len > sizeof (addr))
+    return FALSE;
+
+  _DBUS_ZERO (addr);
+  memcpy (&addr, sockaddr_pointer, len);
+
+  switch (addr.sa.sa_family)
+    {
+      case AF_INET:
+        if (inet_ntop (AF_INET, &addr.ipv4.sin_addr, string, string_len) != NULL)
+          {
+            if (family_name != NULL)
+              *family_name = "ipv4";
+
+            if (port != NULL)
+              *port = ntohs (addr.ipv4.sin_port);
+
+            return TRUE;
+          }
+        else
+          {
+            saved_errno = _dbus_get_low_level_socket_errno ();
+            dbus_set_error (error, _dbus_error_from_errno (saved_errno),
+                            "Failed to get identity of IPv4 socket: %s",
+                            _dbus_strerror (saved_errno));
+          }
+
+        return FALSE;
+
+#ifdef AF_INET6
+      case AF_INET6:
+        if (inet_ntop (AF_INET6, &addr.ipv6.sin6_addr, string, string_len) != NULL)
+          {
+            if (family_name != NULL)
+              *family_name = "ipv6";
+
+            if (port != NULL)
+              *port = ntohs (addr.ipv6.sin6_port);
+
+            return TRUE;
+          }
+        else
+          {
+            saved_errno = _dbus_get_low_level_socket_errno ();
+            dbus_set_error (error, _dbus_error_from_errno (saved_errno),
+                            "Failed to get identity of IPv6 socket: %s",
+                            _dbus_strerror (saved_errno));
+          }
+
+        return FALSE;
+#endif
+
+      default:
+        dbus_set_error (error, DBUS_ERROR_FAILED,
+                        "Failed to get identity of socket: unknown family");
+        return FALSE;
+    }
+}
+
 /** @} end of sysdeps */
 
 /* tests in dbus-sysdeps-util.c */
index 13aeb758fd0b882854741a0dae8907b33b423478..4005a44f0b1cff1035edf73ef0c2ac0b4ceeed2c 100644 (file)
@@ -694,6 +694,14 @@ void            _dbus_daemon_report_reloading              (void);
 void            _dbus_daemon_report_reloaded               (void);
 void            _dbus_daemon_report_stopping               (void);
 
+dbus_bool_t _dbus_inet_sockaddr_to_string (const void *sockaddr_pointer,
+                                           size_t len,
+                                           char *string,
+                                           size_t string_len,
+                                           const char **family_name,
+                                           dbus_uint16_t *port,
+                                           DBusError *error);
+
 /** @} */
 
 DBUS_END_DECLS