[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:
greg@kroah.com 2003-12-08 09:40:40 -08:00 committed by Greg KH
parent 5aebfbcb62
commit 7ac0feeb60
6 changed files with 161 additions and 153 deletions

View File

@ -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)

View File

@ -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);
}

69
udev.c
View File

@ -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;
}

9
udev.h
View File

@ -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

126
udev_dbus.c Normal file
View File

@ -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);
}

23
udev_dbus.h Normal file
View File

@ -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