1 #define DBUS_API_SUBJECT_TO_CHANGE
7 /** variable for the connection the to system message bus or #NULL
8 * if we cannot connect or acquire the org.kernel.udev service
10 static DBusConnection* sysbus_connection;
12 /** Disconnect from the system message bus */
13 void sysbus_disconnect(void)
15 if (sysbus_connection == NULL)
18 dbus_connection_disconnect(sysbus_connection);
19 sysbus_connection = NULL;
22 /** Connect to the system message bus */
23 void sysbus_connect(void)
27 /* Connect to a well-known bus instance, the system bus */
28 dbus_error_init(&error);
29 sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
30 if (sysbus_connection == NULL) {
31 dbg("cannot connect to system message bus, error %s: %s",
32 error.name, error.message);
33 dbus_error_free(&error);
37 /* Acquire the org.kernel.udev service such that listeners
38 * know that the message is really from us and not from a
39 * random attacker. See the file udev_sysbus_policy.conf for
42 * Note that a service can have multiple owners (though there
43 * is a concept of a primary owner for reception of messages)
44 * so no race is introduced if two copies of udev is running
47 dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0,
49 if (dbus_error_is_set(&error)) {
50 printf("cannot acquire org.kernel.udev service, error %s: %s'",
51 error.name, error.message);
58 /** Send out a signal that a device node is created
60 * @param dev udevice object
61 * @param path Sysfs path of device
63 void sysbus_send_create(struct udevice *dev, const char *path)
69 if (sysbus_connection == NULL)
72 strncpy(filename, udev_root, sizeof(filename));
73 strncat(filename, dev->name, sizeof(filename));
75 /* object, interface, member */
76 message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor",
77 "org.kernel.udev.NodeMonitor",
80 dbus_message_iter_init(message, &iter);
81 dbus_message_iter_append_string(&iter, filename);
82 dbus_message_iter_append_string(&iter, path);
84 if ( !dbus_connection_send(sysbus_connection, message, NULL) )
85 dbg("error sending d-bus signal");
87 dbus_message_unref(message);
89 dbus_connection_flush(sysbus_connection);
92 /** Send out a signal that a device node is deleted
94 * @param name Name of the device node, e.g. /udev/sda1
95 * @param path Sysfs path of device
97 void sysbus_send_remove(const char* name, const char *path)
100 DBusMessage* message;
101 DBusMessageIter iter;
103 if (sysbus_connection == NULL)
106 strncpy(filename, udev_root, sizeof(filename));
107 strncat(filename, name, sizeof(filename));
109 /* object, interface, member */
110 message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor",
111 "org.kernel.udev.NodeMonitor",
114 dbus_message_iter_init(message, &iter);
115 dbus_message_iter_append_string(&iter, filename);
116 dbus_message_iter_append_string(&iter, path);
118 if ( !dbus_connection_send(sysbus_connection, message, NULL) )
119 dbg("error sending d-bus signal");
121 dbus_message_unref(message);
123 dbus_connection_flush(sysbus_connection);