chiark / gitweb /
57685163c537c832616978ed5bd478f8ab3e8c49
[elogind.git] / udev_dbus.c
1 #define DBUS_API_SUBJECT_TO_CHANGE
2 #include <dbus/dbus.h>
3
4 #include "udev_dbus.h"
5
6
7 /** variable for the connection the to system message bus or #NULL
8  *  if we cannot connect or acquire the org.kernel.udev service
9  */
10 static DBusConnection* sysbus_connection;
11
12 /** Disconnect from the system message bus */
13 void sysbus_disconnect(void)
14 {
15         if (sysbus_connection == NULL)
16                 return;
17
18         dbus_connection_disconnect(sysbus_connection);
19         sysbus_connection = NULL;
20 }
21
22 /** Connect to the system message bus */
23 void sysbus_connect(void)
24 {
25         DBusError error;
26
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);
34                 return;
35         }
36
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
40          *  details.
41          *
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
45          *  at the same time.
46          */
47         dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0, 
48                                  &error);
49         if (dbus_error_is_set(&error)) {
50                 printf("cannot acquire org.kernel.udev service, error %s: %s'",
51                        error.name, error.message);
52                 sysbus_disconnect();
53                 return;
54         }
55 }
56
57
58 /** Send out a signal that a device node is created
59  *
60  *  @param  dev                 udevice object
61  *  @param  path                Sysfs path of device
62  */
63 void sysbus_send_create(struct udevice *dev, const char *path)
64 {
65         char filename[255];
66         DBusMessage* message;
67         DBusMessageIter iter;
68
69         if (sysbus_connection == NULL)
70                 return;
71
72         strncpy(filename, udev_root, sizeof(filename));
73         strncat(filename, dev->name, sizeof(filename));
74
75         /* object, interface, member */
76         message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", 
77                                           "org.kernel.udev.NodeMonitor",
78                                           "NodeCreated");
79         
80         dbus_message_iter_init(message, &iter);
81         dbus_message_iter_append_string(&iter, filename);
82         dbus_message_iter_append_string(&iter, path);
83
84         if ( !dbus_connection_send(sysbus_connection, message, NULL) )
85                 dbg("error sending d-bus signal");
86
87         dbus_message_unref(message);
88         
89         dbus_connection_flush(sysbus_connection);
90 }
91
92 /** Send out a signal that a device node is deleted
93  *
94  *  @param  name                Name of the device node, e.g. /udev/sda1
95  *  @param  path                Sysfs path of device
96  */
97 void sysbus_send_remove(const char* name, const char *path)
98 {
99         char filename[255];
100         DBusMessage* message;
101         DBusMessageIter iter;
102
103         if (sysbus_connection == NULL)
104                 return;
105
106         strncpy(filename, udev_root, sizeof(filename));
107         strncat(filename, name, sizeof(filename));
108
109         /* object, interface, member */
110         message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", 
111                                           "org.kernel.udev.NodeMonitor",
112                                           "NodeDeleted");
113         
114         dbus_message_iter_init(message, &iter);
115         dbus_message_iter_append_string(&iter, filename);
116         dbus_message_iter_append_string(&iter, path);
117         
118         if ( !dbus_connection_send(sysbus_connection, message, NULL) )
119                 dbg("error sending d-bus signal");
120         
121         dbus_message_unref(message);
122
123         dbus_connection_flush(sysbus_connection);
124 }
125
126