]>
git.ipfire.org Git - thirdparty/systemd.git/blob - udev_dbus.c
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 strfieldcpy(filename
, udev_root
);
84 strfieldcat(filename
, dev
->name
);
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 strfieldcpy(filename
, udev_root
);
118 strfieldcat(filename
, name
);
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
);