diff options
author | david@fubar.dk <david@fubar.dk> | 2003-12-08 09:19:19 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:13:06 -0700 |
commit | 5aebfbcb62614fc2bf2b1579d62e3fe272c6751a (patch) | |
tree | afe2093652343ee02e95880d25cf3b3e48779c74 /udev-remove.c | |
parent | 3d150dfb28efbaf0b25f154fb8955c47d606c3d5 (diff) |
[PATCH] D-BUS patch for udev-008
Attached is a patch against udev-008 to send out a D-BUS message when a
device node is added or removed.
Using D-BUS lingo, udev acquires the org.kernel.udev service and sends
out a NodeCreated or NodeDeleted signal on the
org.kernel.udev.NodeMonitor interface. Each signal carries two
parameters: the node in question and the corresponding sysfs path.
[Note: the D-BUS concepts of service, interface, object can be a bit
confusing at first glance]
An example program listening for these messages looks like this
#!/usr/bin/python
import dbus
import gtk
def udev_signal_received(dbus_iface, member, service, object_path, message):
[filename, sysfs_path] = message.get_args_list()
if member=='NodeCreated':
print 'Node %s created for %s'%(filename, sysfs_path)
elif member=='NodeDeleted':
print 'Node %s deleted for %s'%(filename, sysfs_path)
def main():
bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM)
bus.add_signal_receiver(udev_signal_received,
'org.kernel.udev.NodeMonitor', # interface
'org.kernel.udev', # service
'/org/kernel/udev/NodeMonitor') # object
gtk.mainloop()
if __name__ == '__main__':
main()
and this is the output when hot-plugging some usb-storage.
[david@laptop udev-008]$ ~/node_monitor.py
Node /udev/sda created for /block/sda
Node /udev/sda1 created for /block/sda/sda1
Node /udev/sda1 deleted for /block/sda/sda1
Node /udev/sda deleted for /block/sda
The patch requires D-BUS 0.20 or later while the python example program
requires D-BUS from CVS as I only recently applied a patch against the
python bindings.
Diffstat (limited to 'udev-remove.c')
-rw-r--r-- | udev-remove.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/udev-remove.c b/udev-remove.c index d42ed4be78..307b907c88 100644 --- a/udev-remove.c +++ b/udev-remove.c @@ -100,6 +100,42 @@ 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 @@ -122,5 +158,10 @@ 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 */ + return delete_node(dev); } |