X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev-remove.c;h=98c45d6c333650ff4ebb381ad6508e49568cad7b;hb=e5a2989efbae81f40b60885a8f92ea1f87df7ea9;hp=93adcc7806fe0d1c2211838c4b259297960fa5d8;hpb=9fe3f9a9389bb06cf645d33cbb2b45e1f63d737c;p=elogind.git diff --git a/udev-remove.c b/udev-remove.c index 93adcc780..98c45d6c3 100644 --- a/udev-remove.c +++ b/udev-remove.c @@ -29,8 +29,8 @@ #include #include "udev.h" +#include "udev_lib.h" #include "udev_version.h" -#include "udev_dbus.h" #include "logging.h" #include "namedev.h" #include "udevdb.h" @@ -72,7 +72,8 @@ static int delete_node(struct udevice *dev) char partitionname[NAME_SIZE]; int retval; int i; - int pos, len; + char *pos; + int len; strfieldcpy(filename, udev_root); strfieldcat(filename, dev->name); @@ -102,7 +103,7 @@ static int delete_node(struct udevice *dev) delete_path(filename); foreach_strpart(dev->symlink, " ", pos, len) { - strnfieldcpy(linkname, dev->symlink + pos, len+1); + strfieldcpymax(linkname, pos, len+1); strfieldcpy(filename, udev_root); strfieldcat(filename, linkname); @@ -134,22 +135,38 @@ int udev_remove_device(char *path, char *subsystem) char *temp; int retval; - memset(&dev, 0, sizeof(dev)); + memset(&dev, 0x00, sizeof(dev)); - 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; - strfieldcpy(dev.name, &temp[1]); - } + dev.type = get_device_type(path, subsystem); + + switch (dev.type) { + case 'b': + case 'c': + 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; + strfieldcpy(dev.name, &temp[1]); + } - dbg("name is '%s'", dev.name); - udevdb_delete_dev(path); + dbg("name='%s'", dev.name); + udevdb_delete_dev(path); - sysbus_send_remove(dev.name, path); + dev_d_send(&dev, subsystem); + + retval = delete_node(&dev); + break; + + case 'n': + retval = 0; + break; + + default: + dbg("unknown device type '%c'", dev.type); + retval = -EINVAL; + } - retval = delete_node(&dev); return retval; }