[PATCH] move all of the DBUS logic into one file and remove all of the #ifdef crud from the main code.
This commit is contained in:
parent
5aebfbcb62
commit
7ac0feeb60
44
udev-add.c
44
udev-add.c
|
@ -36,6 +36,7 @@
|
||||||
|
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
#include "udev_version.h"
|
#include "udev_version.h"
|
||||||
|
#include "udev_dbus.h"
|
||||||
#include "namedev.h"
|
#include "namedev.h"
|
||||||
#include "udevdb.h"
|
#include "udevdb.h"
|
||||||
#include "libsysfs/libsysfs.h"
|
#include "libsysfs/libsysfs.h"
|
||||||
|
@ -100,42 +101,6 @@ static int create_path(char *file)
|
||||||
return 0;
|
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
|
* we possibly want to add some symlinks here
|
||||||
* only numeric owner/group id's are supported
|
* 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);
|
dbg("name='%s'", dev.name);
|
||||||
retval = create_node(&dev);
|
retval = create_node(&dev);
|
||||||
|
|
||||||
#ifdef USE_DBUS
|
if (retval == 0)
|
||||||
if (retval == 0) {
|
sysbus_send_create(&dev, path);
|
||||||
sysbus_send_create(&dev, path);
|
|
||||||
}
|
|
||||||
#endif /* USE_DBUS */
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (class_dev)
|
if (class_dev)
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
#include "udev_version.h"
|
#include "udev_version.h"
|
||||||
|
#include "udev_dbus.h"
|
||||||
#include "namedev.h"
|
#include "namedev.h"
|
||||||
#include "udevdb.h"
|
#include "udevdb.h"
|
||||||
#include "libsysfs/libsysfs.h"
|
#include "libsysfs/libsysfs.h"
|
||||||
|
@ -100,42 +101,6 @@ static int delete_node(struct udevice *dev)
|
||||||
return retval;
|
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
|
* 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
|
* 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);
|
dbg("name is '%s'", dev->name);
|
||||||
udevdb_delete_dev(path);
|
udevdb_delete_dev(path);
|
||||||
|
|
||||||
#ifdef USE_DBUS
|
sysbus_send_remove(name, path);
|
||||||
sysbus_send_remove(name, device);
|
|
||||||
#endif /* USE_DBUS */
|
|
||||||
|
|
||||||
return delete_node(dev);
|
return delete_node(dev);
|
||||||
}
|
}
|
||||||
|
|
69
udev.c
69
udev.c
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
#include "udev_version.h"
|
#include "udev_version.h"
|
||||||
|
#include "udev_dbus.h"
|
||||||
#include "namedev.h"
|
#include "namedev.h"
|
||||||
#include "udevdb.h"
|
#include "udevdb.h"
|
||||||
#include "libsysfs/libsysfs.h"
|
#include "libsysfs/libsysfs.h"
|
||||||
|
@ -63,60 +64,6 @@ static inline char *get_seqnum(void)
|
||||||
return seqnum;
|
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)
|
int main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
char *action;
|
char *action;
|
||||||
|
@ -165,10 +112,8 @@ int main(int argc, char **argv, char **envp)
|
||||||
/* initialize our configuration */
|
/* initialize our configuration */
|
||||||
udev_init_config();
|
udev_init_config();
|
||||||
|
|
||||||
#ifdef USE_DBUS
|
/* connect to the system message bus */
|
||||||
/* connect to the system message bus */
|
sysbus_connect();
|
||||||
sysbus_connect();
|
|
||||||
#endif /* USE_DBUS */
|
|
||||||
|
|
||||||
/* initialize udev database */
|
/* initialize udev database */
|
||||||
retval = udevdb_init(UDEVDB_DEFAULT);
|
retval = udevdb_init(UDEVDB_DEFAULT);
|
||||||
|
@ -192,11 +137,9 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
udevdb_exit();
|
udevdb_exit();
|
||||||
|
|
||||||
#ifdef USE_DBUS
|
/* disconnect from the system message bus */
|
||||||
/* disconnect from the system message bus */
|
sysbus_disconnect();
|
||||||
sysbus_disconnect();
|
|
||||||
#endif /* USE_DBUS */
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
9
udev.h
9
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 udev_rules_filename[PATH_MAX+NAME_MAX];
|
||||||
extern char default_mode_str[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
|
#endif
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue