diff options
-rw-r--r-- | udev-add.c | 44 | ||||
-rw-r--r-- | udev-remove.c | 43 | ||||
-rw-r--r-- | udev.c | 69 | ||||
-rw-r--r-- | udev.h | 9 | ||||
-rw-r--r-- | udev_dbus.c | 126 | ||||
-rw-r--r-- | udev_dbus.h | 23 |
6 files changed, 161 insertions, 153 deletions
diff --git a/udev-add.c b/udev-add.c index 174331fade..8d45b26077 100644 --- a/udev-add.c +++ b/udev-add.c @@ -36,6 +36,7 @@ #include "udev.h" #include "udev_version.h" +#include "udev_dbus.h" #include "namedev.h" #include "udevdb.h" #include "libsysfs/libsysfs.h" @@ -100,42 +101,6 @@ static int create_path(char *file) return 0; } -#ifdef USE_DBUS -/** Send out a signal that a device node is created - * - * @param dev udevice object - * @param path Sysfs path of device - */ -static void sysbus_send_create(struct udevice *dev, const char *path) -{ - char filename[255]; - DBusMessage* message; - DBusMessageIter iter; - - if (sysbus_connection == NULL) - return; - - strncpy(filename, udev_root, sizeof(filename)); - strncat(filename, dev->name, sizeof(filename)); - - /* object, interface, member */ - message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", - "org.kernel.udev.NodeMonitor", - "NodeCreated"); - - dbus_message_iter_init(message, &iter); - dbus_message_iter_append_string(&iter, filename); - dbus_message_iter_append_string(&iter, path); - - if ( !dbus_connection_send(sysbus_connection, message, NULL) ) - dbg("error sending d-bus signal"); - - dbus_message_unref(message); - - dbus_connection_flush(sysbus_connection); -} -#endif /* USE_DBUS */ - /* * we possibly want to add some symlinks here * only numeric owner/group id's are supported @@ -359,11 +324,8 @@ int udev_add_device(char *path, char *subsystem) dbg("name='%s'", dev.name); retval = create_node(&dev); -#ifdef USE_DBUS - if (retval == 0) { - sysbus_send_create(&dev, path); - } -#endif /* USE_DBUS */ + if (retval == 0) + sysbus_send_create(&dev, path); exit: if (class_dev) diff --git a/udev-remove.c b/udev-remove.c index 307b907c88..02c84371a4 100644 --- a/udev-remove.c +++ b/udev-remove.c @@ -30,6 +30,7 @@ #include "udev.h" #include "udev_version.h" +#include "udev_dbus.h" #include "namedev.h" #include "udevdb.h" #include "libsysfs/libsysfs.h" @@ -100,42 +101,6 @@ static int delete_node(struct udevice *dev) return retval; } -#ifdef USE_DBUS -/** Send out a signal that a device node is deleted - * - * @param name Name of the device node, e.g. /udev/sda1 - * @param path Sysfs path of device - */ -static void sysbus_send_remove(const char* name, const char *path) -{ - char filename[255]; - DBusMessage* message; - DBusMessageIter iter; - - if (sysbus_connection == NULL) - return; - - strncpy(filename, udev_root, sizeof(filename)); - strncat(filename, name, sizeof(filename)); - - /* object, interface, member */ - message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", - "org.kernel.udev.NodeMonitor", - "NodeDeleted"); - - dbus_message_iter_init(message, &iter); - dbus_message_iter_append_string(&iter, filename); - dbus_message_iter_append_string(&iter, path); - - if ( !dbus_connection_send(sysbus_connection, message, NULL) ) - dbg("error sending d-bus signal"); - - dbus_message_unref(message); - - dbus_connection_flush(sysbus_connection); -} -#endif /* USE_DBUS */ - /* * Look up the sysfs path in the database to see if we have named this device * something different from the kernel name. If we have, us it. If not, use @@ -159,9 +124,7 @@ int udev_remove_device(char *path, char *subsystem) dbg("name is '%s'", dev->name); udevdb_delete_dev(path); -#ifdef USE_DBUS - sysbus_send_remove(name, device); -#endif /* USE_DBUS */ - + sysbus_send_remove(name, path); + return delete_node(dev); } @@ -31,6 +31,7 @@ #include "udev.h" #include "udev_version.h" +#include "udev_dbus.h" #include "namedev.h" #include "udevdb.h" #include "libsysfs/libsysfs.h" @@ -63,60 +64,6 @@ static inline char *get_seqnum(void) return seqnum; } -#ifdef USE_DBUS - -/** Global variable for the connection the to system message bus or #NULL - * if we cannot connect or acquire the org.kernel.udev service - */ -DBusConnection* sysbus_connection; - -/** Disconnect from the system message bus */ -static void sysbus_disconnect() -{ - if (sysbus_connection == NULL) - return; - - dbus_connection_disconnect(sysbus_connection); - sysbus_connection = NULL; -} - -/** Connect to the system message bus */ -static void sysbus_connect() -{ - DBusError error; - - /* Connect to a well-known bus instance, the system bus */ - dbus_error_init(&error); - sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); - if (sysbus_connection == NULL) { - dbg("cannot connect to system message bus, error %s: %s", - error.name, error.message); - dbus_error_free(&error); - return; - } - - /* Acquire the org.kernel.udev service such that listeners - * know that the message is really from us and not from a - * random attacker. See the file udev_sysbus_policy.conf for - * details. - * - * Note that a service can have multiple owners (though there - * is a concept of a primary owner for reception of messages) - * so no race is introduced if two copies of udev is running - * at the same time. - */ - dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0, - &error); - if (dbus_error_is_set(&error)) { - printf("cannot acquire org.kernel.udev service, error %s: %s'", - error.name, error.message); - sysbus_disconnect(); - return; - } -} - -#endif /* USE_DBUS */ - int main(int argc, char **argv, char **envp) { char *action; @@ -165,10 +112,8 @@ int main(int argc, char **argv, char **envp) /* initialize our configuration */ udev_init_config(); -#ifdef USE_DBUS - /* connect to the system message bus */ - sysbus_connect(); -#endif /* USE_DBUS */ + /* connect to the system message bus */ + sysbus_connect(); /* initialize udev database */ retval = udevdb_init(UDEVDB_DEFAULT); @@ -192,11 +137,9 @@ int main(int argc, char **argv, char **envp) } udevdb_exit(); -#ifdef USE_DBUS - /* disconnect from the system message bus */ - sysbus_disconnect(); -#endif /* USE_DBUS */ + /* disconnect from the system message bus */ + sysbus_disconnect(); -exit: +exit: return retval; } @@ -93,13 +93,4 @@ extern char udev_config_filename[PATH_MAX+NAME_MAX]; extern char udev_rules_filename[PATH_MAX+NAME_MAX]; extern char default_mode_str[NAME_MAX]; -#ifdef USE_DBUS - -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus.h> - -extern DBusConnection* sysbus_connection; - -#endif /* USE_DBUS */ - #endif diff --git a/udev_dbus.c b/udev_dbus.c new file mode 100644 index 0000000000..57685163c5 --- /dev/null +++ b/udev_dbus.c @@ -0,0 +1,126 @@ +#define DBUS_API_SUBJECT_TO_CHANGE +#include <dbus/dbus.h> + +#include "udev_dbus.h" + + +/** variable for the connection the to system message bus or #NULL + * if we cannot connect or acquire the org.kernel.udev service + */ +static DBusConnection* sysbus_connection; + +/** Disconnect from the system message bus */ +void sysbus_disconnect(void) +{ + if (sysbus_connection == NULL) + return; + + dbus_connection_disconnect(sysbus_connection); + sysbus_connection = NULL; +} + +/** Connect to the system message bus */ +void sysbus_connect(void) +{ + DBusError error; + + /* Connect to a well-known bus instance, the system bus */ + dbus_error_init(&error); + sysbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + if (sysbus_connection == NULL) { + dbg("cannot connect to system message bus, error %s: %s", + error.name, error.message); + dbus_error_free(&error); + return; + } + + /* Acquire the org.kernel.udev service such that listeners + * know that the message is really from us and not from a + * random attacker. See the file udev_sysbus_policy.conf for + * details. + * + * Note that a service can have multiple owners (though there + * is a concept of a primary owner for reception of messages) + * so no race is introduced if two copies of udev is running + * at the same time. + */ + dbus_bus_acquire_service(sysbus_connection, "org.kernel.udev", 0, + &error); + if (dbus_error_is_set(&error)) { + printf("cannot acquire org.kernel.udev service, error %s: %s'", + error.name, error.message); + sysbus_disconnect(); + return; + } +} + + +/** Send out a signal that a device node is created + * + * @param dev udevice object + * @param path Sysfs path of device + */ +void sysbus_send_create(struct udevice *dev, const char *path) +{ + char filename[255]; + DBusMessage* message; + DBusMessageIter iter; + + if (sysbus_connection == NULL) + return; + + strncpy(filename, udev_root, sizeof(filename)); + strncat(filename, dev->name, sizeof(filename)); + + /* object, interface, member */ + message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", + "org.kernel.udev.NodeMonitor", + "NodeCreated"); + + dbus_message_iter_init(message, &iter); + dbus_message_iter_append_string(&iter, filename); + dbus_message_iter_append_string(&iter, path); + + if ( !dbus_connection_send(sysbus_connection, message, NULL) ) + dbg("error sending d-bus signal"); + + dbus_message_unref(message); + + dbus_connection_flush(sysbus_connection); +} + +/** Send out a signal that a device node is deleted + * + * @param name Name of the device node, e.g. /udev/sda1 + * @param path Sysfs path of device + */ +void sysbus_send_remove(const char* name, const char *path) +{ + char filename[255]; + DBusMessage* message; + DBusMessageIter iter; + + if (sysbus_connection == NULL) + return; + + strncpy(filename, udev_root, sizeof(filename)); + strncat(filename, name, sizeof(filename)); + + /* object, interface, member */ + message = dbus_message_new_signal("/org/kernel/udev/NodeMonitor", + "org.kernel.udev.NodeMonitor", + "NodeDeleted"); + + dbus_message_iter_init(message, &iter); + dbus_message_iter_append_string(&iter, filename); + dbus_message_iter_append_string(&iter, path); + + if ( !dbus_connection_send(sysbus_connection, message, NULL) ) + dbg("error sending d-bus signal"); + + dbus_message_unref(message); + + dbus_connection_flush(sysbus_connection); +} + + diff --git a/udev_dbus.h b/udev_dbus.h new file mode 100644 index 0000000000..afa2046548 --- /dev/null +++ b/udev_dbus.h @@ -0,0 +1,23 @@ +#ifndef UDEV_DBUS_H +#define UDEV_DBUS_H + + +#ifdef USE_DBUS + +extern void sysbus_connect(void); +extern void sysbus_disconnect(void); +extern void sysbus_send_create(struct udevice *dev, const char *path); +extern void sysbus_send_remove(const char* name, const char *path); + +#else + +static inline void sysbus_connect(void) { } +static inline void sysbus_disconnect(void) { } +static inline void sysbus_send_create(struct udevice *dev, const char *path) { } +static inline void sysbus_send_remove(const char* name, const char *path) { } + +#endif /* USE_DBUS */ + + + +#endif |