X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev-remove.c;h=9db63ed93e536111266fcf694d3cdd00aff4e5da;hp=307b907c8897be44a99122adbeca131c8e05e1b8;hb=b2a21a35476b4780ef1fc68c60216117ab66fa2b;hpb=5aebfbcb62614fc2bf2b1579d62e3fe272c6751a diff --git a/udev-remove.c b/udev-remove.c index 307b907c8..9db63ed93 100644 --- a/udev-remove.c +++ b/udev-remove.c @@ -30,6 +30,8 @@ #include "udev.h" #include "udev_version.h" +#include "udev_dbus.h" +#include "logging.h" #include "namedev.h" #include "udevdb.h" #include "libsysfs/libsysfs.h" @@ -65,12 +67,14 @@ 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)); strncat(filename, dev->name, sizeof(filename)); - dbg("unlinking node '%s'", filename); + info("removing device node '%s'", filename); retval = unlink(filename); if (retval) { dbg("unlink(%s) failed with error '%s'", @@ -83,59 +87,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 @@ -143,25 +119,26 @@ static void sysbus_send_remove(const char* name, const char *path) */ int udev_remove_device(char *path, char *subsystem) { - char name[100]; - struct udevice *dev; + struct udevice dev; char *temp; + int retval; + + memset(&dev, 0, sizeof(dev)); - dev = udevdb_get_dev(path); - if (dev == NULL) { + retval = udevdb_get_dev(path, &dev); + if (retval) { dbg("'%s' not found in database, falling back on default name", path); temp = strrchr(path, '/'); if (temp == NULL) return -ENODEV; - strncpy(name, &temp[1], sizeof(name)); + strncpy(dev.name, &temp[1], sizeof(dev.name)); } - dbg("name is '%s'", dev->name); + 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); + sysbus_send_remove(dev.name, path); + + retval = delete_node(&dev); + return retval; }