aboutsummaryrefslogtreecommitdiffstats
path: root/udev.c
diff options
context:
space:
mode:
Diffstat (limited to 'udev.c')
-rw-r--r--udev.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/udev.c b/udev.c
index bf18a568..67b86e59 100644
--- a/udev.c
+++ b/udev.c
@@ -63,6 +63,60 @@ static inline char *get_seqnum(void)
return seqnum;
}
+#ifdef USE_DBUS
+
+/** Global variable for the connection the to system message bus or #NULL
+ * if we cannot connect or acquire the org.kernel.udev service
+ */
+DBusConnection* sysbus_connection;
+
+/** Disconnect from the system message bus */
+static void sysbus_disconnect()
+{
+ if (sysbus_connection == NULL)
+ return;
+
+ dbus_connection_disconnect(sysbus_connection);
+ sysbus_connection = NULL;
+}
+
+/** Connect to the system message bus */
+static void sysbus_connect()
+{
+ DBusError error;
+
+ /* Connect to a well-known bus instance, the system bus */
+ dbus_error_init(&error);
+ sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+ if (sysbus_connection == NULL) {
+ dbg("cannot connect to system message bus, error %s: %s",
+ error.name, error.message);
+ dbus_error_free(&error);
+ return;
+ }
+
+ /* Acquire the org.kernel.udev service such that listeners
+ * know that the message is really from us and not from a
+ * random attacker. See the file udev_sysbus_policy.conf for
+ * details.
+ *
+ * Note that a service can have multiple owners (though there
+ * is a concept of a primary owner for reception of messages)
+ * so no race is introduced if two copies of udev is running
+ * at the same time.
+ */
+ dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0,
+ &error);
+ if (dbus_error_is_set(&error)) {
+ printf("cannot acquire org.kernel.udev service, error %s: %s'",
+ error.name, error.message);
+ sysbus_disconnect();
+ return;
+ }
+}
+
+#endif /* USE_DBUS */
+
int main(int argc, char **argv, char **envp)
{
char *action;
@@ -111,6 +165,11 @@ int main(int argc, char **argv, char **envp)
/* initialize our configuration */
udev_init_config();
+#ifdef USE_DBUS
+ /* connect to the system message bus */
+ sysbus_connect();
+#endif /* USE_DBUS */
+
/* initialize udev database */
retval = udevdb_init(UDEVDB_DEFAULT);
if (retval != 0) {
@@ -133,6 +192,11 @@ int main(int argc, char **argv, char **envp)
}
udevdb_exit();
+#ifdef USE_DBUS
+ /* disconnect from the system message bus */
+ sysbus_disconnect();
+#endif /* USE_DBUS */
+
exit:
return retval;
}