summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev-add.c44
-rw-r--r--udev-remove.c43
-rw-r--r--udev.c69
-rw-r--r--udev.h9
-rw-r--r--udev_dbus.c126
-rw-r--r--udev_dbus.h23
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);
}
diff --git a/udev.c b/udev.c
index 67b86e5916..ac29ec6f44 100644
--- a/udev.c
+++ b/udev.c
@@ -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;
}
diff --git a/udev.h b/udev.h
index 4ea04d5e71..05f6b3c225 100644
--- a/udev.h
+++ b/udev.h
@@ -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