9 #define DBUS_API_SUBJECT_TO_CHANGE
10 #include <dbus/dbus.h>
13 #include "udev_version.h"
14 #include "udev_dbus.h"
18 unsigned char logname[LOGNAME_SIZE];
19 void log_message(int level, const char *format, ...)
26 va_start(args, format);
27 vsyslog(level, format, args);
32 /** variable for the connection the to system message bus or #NULL
33 * if we cannot connect or acquire the org.kernel.udev service
35 static DBusConnection* sysbus_connection;
37 /** Disconnect from the system message bus */
38 static void sysbus_disconnect(void)
40 if (sysbus_connection == NULL)
43 dbus_connection_disconnect(sysbus_connection);
44 sysbus_connection = NULL;
47 /** Connect to the system message bus */
48 static void sysbus_connect(void)
52 /* Connect to a well-known bus instance, the system bus */
53 dbus_error_init(&error);
54 sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
55 if (sysbus_connection == NULL) {
56 dbg("cannot connect to system message bus, error %s: %s",
57 error.name, error.message);
58 dbus_error_free(&error);
62 /* Acquire the org.kernel.udev service such that listeners
63 * know that the message is really from us and not from a
64 * random attacker. See the file udev_sysbus_policy.conf for
67 * Note that a service can have multiple owners (though there
68 * is a concept of a primary owner for reception of messages)
69 * so no race is introduced if two copies of udev is running
72 dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0,
74 if (dbus_error_is_set(&error)) {
75 printf("cannot acquire org.kernel.udev service, error %s: %s'",
76 error.name, error.message);
83 /** Send out a signal that a device node is created
85 * @param devnode name of the device node, e.g. /dev/sda1
86 * @param path Sysfs path of device
88 static void sysbus_send_create(const char *devnode, const char *path)
93 /* object, interface, member */
94 message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor",
95 "org.kernel.udev.NodeMonitor",
98 dbus_message_iter_init(message, &iter);
99 dbus_message_iter_append_string(&iter, devnode);
100 dbus_message_iter_append_string(&iter, path);
102 if ( !dbus_connection_send(sysbus_connection, message, NULL) )
103 dbg("error sending d-bus signal");
105 dbus_message_unref(message);
107 dbus_connection_flush(sysbus_connection);
110 /** Send out a signal that a device node is deleted
112 * @param devnode Name of the device node, e.g. /udev/sda1
113 * @param path Sysfs path of device
115 static void sysbus_send_remove(const char *devnode, const char *path)
117 DBusMessage* message;
118 DBusMessageIter iter;
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, devnode);
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);
137 int main(int argc, char *argv[], char *envp[])
144 init_logging("udev_dbus");
147 if (sysbus_connection == NULL)
150 action = get_action();
155 devpath = get_devpath();
160 devnode = get_devnode();
166 if (strcmp(action, "add") == 0) {
167 sysbus_send_create(devnode, devpath);
169 if (strcmp(action, "remove") == 0) {
170 sysbus_send_remove(devnode, devpath);
172 dbg("unknown action '%s'", action);