9 #define DBUS_API_SUBJECT_TO_CHANGE
10 #include <dbus/dbus.h>
13 #include "udev_version.h"
14 #include "udev_dbus.h"
18 /** variable for the connection the to system message bus or #NULL
19 * if we cannot connect or acquire the org.kernel.udev service
21 static DBusConnection* sysbus_connection;
23 /** Disconnect from the system message bus */
24 void sysbus_disconnect(void)
26 if (sysbus_connection == NULL)
29 dbus_connection_disconnect(sysbus_connection);
30 sysbus_connection = NULL;
33 /** Connect to the system message bus */
34 void sysbus_connect(void)
38 /* Connect to a well-known bus instance, the system bus */
39 dbus_error_init(&error);
40 sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
41 if (sysbus_connection == NULL) {
42 dbg("cannot connect to system message bus, error %s: %s",
43 error.name, error.message);
44 dbus_error_free(&error);
48 /* Acquire the org.kernel.udev service such that listeners
49 * know that the message is really from us and not from a
50 * random attacker. See the file udev_sysbus_policy.conf for
53 * Note that a service can have multiple owners (though there
54 * is a concept of a primary owner for reception of messages)
55 * so no race is introduced if two copies of udev is running
58 dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0,
60 if (dbus_error_is_set(&error)) {
61 printf("cannot acquire org.kernel.udev service, error %s: %s'",
62 error.name, error.message);
69 /** Send out a signal that a device node is created
71 * @param dev udevice object
72 * @param path Sysfs path of device
74 void sysbus_send_create(struct udevice *dev, const char *path)
80 if (sysbus_connection == NULL)
83 strncpy(filename, udev_root, sizeof(filename));
84 strncat(filename, dev->name, sizeof(filename));
86 /* object, interface, member */
87 message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor",
88 "org.kernel.udev.NodeMonitor",
91 dbus_message_iter_init(message, &iter);
92 dbus_message_iter_append_string(&iter, filename);
93 dbus_message_iter_append_string(&iter, path);
95 if ( !dbus_connection_send(sysbus_connection, message, NULL) )
96 dbg("error sending d-bus signal");
98 dbus_message_unref(message);
100 dbus_connection_flush(sysbus_connection);
103 /** Send out a signal that a device node is deleted
105 * @param name Name of the device node, e.g. /udev/sda1
106 * @param path Sysfs path of device
108 void sysbus_send_remove(const char* name, const char *path)
111 DBusMessage* message;
112 DBusMessageIter iter;
114 if (sysbus_connection == NULL)
117 strncpy(filename, udev_root, sizeof(filename));
118 strncat(filename, name, sizeof(filename));
120 /* object, interface, member */
121 message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor",
122 "org.kernel.udev.NodeMonitor",
125 dbus_message_iter_init(message, &iter);
126 dbus_message_iter_append_string(&iter, filename);
127 dbus_message_iter_append_string(&iter, path);
129 if ( !dbus_connection_send(sysbus_connection, message, NULL) )
130 dbg("error sending d-bus signal");
132 dbus_message_unref(message);
134 dbus_connection_flush(sysbus_connection);