sysdeps-unix: introduce _dbus_socket_can_pass_unix_fd()
authorLennart Poettering <lennart@poettering.net>
Wed, 22 Apr 2009 01:14:42 +0000 (03:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 19 May 2009 23:36:26 +0000 (01:36 +0200)
This function can be used to check if a socket can be used to pass file
descriptors. On platforms that don't support this at all this is
hardcoded to return FALSE.

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

index 5f94c6a58f628fa5686f91a065c2f9dce5f9699a..74a95661d3079c878ca301a7d5501890a06b520a 100644 (file)
@@ -3462,4 +3462,36 @@ _dbus_get_is_errno_eagain_or_ewouldblock (void)
   return errno == EAGAIN || errno == EWOULDBLOCK;
 }
 
+/**
+ *  Checks whether file descriptors may be passed via the socket
+ *
+ *  @param fd the socket
+ *  @return TRUE when fd passing over this socket is supported
+ *
+ */
+dbus_bool_t
+_dbus_socket_can_pass_unix_fd(int fd) {
+
+#ifdef SCM_RIGHTS
+  union {
+    struct sockaddr sa;
+    struct sockaddr_storage storage;
+    struct sockaddr_un un;
+  } sa_buf;
+
+  socklen_t sa_len = sizeof(sa_buf);
+
+  _DBUS_ZERO(sa_buf);
+
+  if (getsockname(fd, &sa_buf.sa, &sa_len) < 0)
+    return FALSE;
+
+  return sa_buf.sa.sa_family == AF_UNIX;
+
+#else
+  return FALSE;
+
+#endif
+}
+
 /* tests in dbus-sysdeps-util.c */
index b766f3f9ee9ca00cc63efb8419d24704487fb1d6..68fcdf619b174b8cf7677d4cadc73cbb5cfd8f34 100644 (file)
@@ -192,6 +192,8 @@ dbus_bool_t _dbus_windows_user_is_process_owner (const char        *windows_sid)
 dbus_bool_t _dbus_append_keyring_directory_for_credentials (DBusString      *directory,
                                                             DBusCredentials *credentials);
 
+dbus_bool_t _dbus_socket_can_pass_unix_fd(int fd);
+
 /** Opaque type representing an atomically-modifiable integer
  * that can be used from multiple threads.
  */