X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev-remove.c;h=0886c23343e0a7ee98fe8539cd130ff6783034ed;hp=307b907c8897be44a99122adbeca131c8e05e1b8;hb=71896b56ee03a8f31c89263bbf5f4cb7201666be;hpb=5aebfbcb62614fc2bf2b1579d62e3fe272c6751a diff --git a/udev-remove.c b/udev-remove.c index 307b907c8..0886c2334 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" @@ -65,6 +66,8 @@ static int delete_path(char *path) static int delete_node(struct udevice *dev) { char filename[255]; + char *symlinks; + char *linkname; int retval; strncpy(filename, udev_root, sizeof(filename)); @@ -83,59 +86,31 @@ static int delete_node(struct udevice *dev) delete_path(filename); if (*dev->symlink) { - strncpy(filename, udev_root, sizeof(filename)); - strncat(filename, dev->symlink, sizeof(filename)); - dbg("unlinking symlink '%s'", filename); - retval = unlink(filename); - if (retval) { - dbg("unlink(%s) failed with error '%s'", - filename, strerror(errno)); - return retval; - } - if (strchr(dev->symlink, '/')) { - delete_path(filename); + symlinks = dev->symlink; + while (1) { + linkname = strsep(&symlinks, " "); + if (linkname == NULL) + break; + + strncpy(filename, udev_root, sizeof(filename)); + strncat(filename, linkname, sizeof(filename)); + + dbg("unlinking symlink '%s'", filename); + retval = unlink(filename); + if (retval) { + dbg("unlink(%s) failed with error '%s'", + filename, strerror(errno)); + return retval; + } + if (strchr(dev->symlink, '/')) { + delete_path(filename); + } } } 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 +134,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); }