summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodrigo Moya <rodrigo.moya@collabora.co.uk>2012-06-06 16:05:13 +0200
committerRodrigo Moya <rodrigo@gnome-db.org>2012-06-06 16:05:13 +0200
commit12aabb859e7814502ea26f8e537b6a5f13ffdaa6 (patch)
tree2c1c8a0908a0cc283706cb4b0691237055af261b
parent7b326031a11eecb56ba0cb6ef72fdb78609a27e7 (diff)
downloaddbus-12aabb859e7814502ea26f8e537b6a5f13ffdaa6.tar.gz
Assign an address on RequestName for AF_BUS peers
-rw-r--r--bus/driver-afbus.c32
-rw-r--r--bus/driver-afbus.h7
-rw-r--r--bus/driver.c7
3 files changed, 46 insertions, 0 deletions
diff --git a/bus/driver-afbus.c b/bus/driver-afbus.c
index bf18781f..507a19a6 100644
--- a/bus/driver-afbus.c
+++ b/bus/driver-afbus.c
@@ -283,3 +283,35 @@ bus_driver_afbus_emit_forwarded (BusTransaction *transaction,
return result;
}
+
+dbus_bool_t
+bus_driver_afbus_assign_address (DBusConnection *connection)
+{
+ struct sockaddr_bus address;
+ long len = sizeof (address);
+ int fd;
+ static unsigned long long next_address = 0x1111000000000001;
+
+ memset (&address, 0, sizeof (address));
+ if (!dbus_connection_get_peer_address (connection, &address, &len) ||
+ ((struct sockaddr *) &address)->sa_family != AF_BUS)
+ {
+ /* Don't return an error if it is not a AF_BUS socket */
+ return TRUE;
+ }
+
+ if (!dbus_connection_get_unix_fd (connection, &fd))
+ {
+ return FALSE;
+ }
+
+ address.sbus_addr.s_addr = next_address;
+ if (setsockopt (fd, SOL_BUS, BUS_ADD_ADDR, &address, sizeof (address)) != 0)
+ {
+ return FALSE;
+ }
+
+ next_address++;
+
+ return TRUE;
+}
diff --git a/bus/driver-afbus.h b/bus/driver-afbus.h
index e5d67e97..e179537e 100644
--- a/bus/driver-afbus.h
+++ b/bus/driver-afbus.h
@@ -41,6 +41,7 @@ dbus_bool_t bus_driver_afbus_emit_forwarded (BusTransaction *transaction,
DBusConnection *connection,
DBusConnection *addressed_recipient,
const char *service_name);
+dbus_bool_t bus_driver_afbus_assign_address (DBusConnection *connection);
#else
static inline
dbus_bool_t bus_driver_afbus_add_match_rule (DBusConnection *connection,
@@ -74,6 +75,12 @@ dbus_bool_t bus_driver_afbus_emit_forwarded (BusTransaction *transaction,
return TRUE;
}
+static inline
+dbus_bool_t bus_driver_afbus_assign_address (DBusConnection *connection)
+{
+ return TRUE;
+}
+
#endif
#endif /* BUS_DRIVER_AFBUS_H */
diff --git a/bus/driver.c b/bus/driver.c
index 740d8963..d776e2cc 100644
--- a/bus/driver.c
+++ b/bus/driver.c
@@ -616,6 +616,13 @@ bus_driver_handle_acquire_service (DBusConnection *connection,
goto out;
}
+ /* If using AF_BUS, assign an address to this peer */
+ if (!bus_driver_afbus_assign_address (connection))
+ {
+ BUS_SET_OOM (error);
+ goto out;
+ }
+
retval = TRUE;
out: