X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev-remove.c;h=8794429635bd0caec5f53b294dcd713464f720b2;hb=84d282a9d29f9c1191fca8e58246e9fc912ab2e9;hp=6d7e2ad22a9c6d8af3becb485709a05e8d1ab202;hpb=a56ef382869bb76ade6d26cd7e8adc983ca3f89e;p=elogind.git diff --git a/udev-remove.c b/udev-remove.c index 6d7e2ad22..879442963 100644 --- a/udev-remove.c +++ b/udev-remove.c @@ -31,9 +31,9 @@ #include "udev.h" #include "udev_version.h" #include "udev_dbus.h" +#include "logging.h" #include "namedev.h" #include "udevdb.h" -#include "libsysfs/libsysfs.h" static int delete_path(char *path) { @@ -66,14 +66,16 @@ static int delete_path(char *path) static int delete_node(struct udevice *dev) { char filename[255]; + char partitionname[255]; char *symlinks; char *linkname; int retval; + int i; - strncpy(filename, udev_root, sizeof(filename)); - strncat(filename, dev->name, sizeof(filename)); + strfieldcpy(filename, udev_root); + strfieldcat(filename, dev->name); - dbg("unlinking node '%s'", filename); + info("removing device node '%s'", filename); retval = unlink(filename); if (retval) { dbg("unlink(%s) failed with error '%s'", @@ -81,19 +83,28 @@ static int delete_node(struct udevice *dev) return retval; } + /* remove partition nodes */ + if (dev->partitions > 0) { + info("removing partitions '%s[1-%i]'", filename, dev->partitions); + for (i = 1; i <= dev->partitions; i++) { + sprintf(partitionname, "%s%i", filename, i); + unlink(partitionname); + } + } + /* remove subdirectories */ if (strchr(dev->name, '/')) delete_path(filename); - if (*dev->symlink) { + if (dev->symlink[0] != '\0') { symlinks = dev->symlink; while (1) { linkname = strsep(&symlinks, " "); if (linkname == NULL) break; - strncpy(filename, udev_root, sizeof(filename)); - strncat(filename, linkname, sizeof(filename)); + strfieldcpy(filename, udev_root); + strfieldcat(filename, linkname); dbg("unlinking symlink '%s'", filename); retval = unlink(filename); @@ -118,30 +129,26 @@ static int delete_node(struct udevice *dev) */ int udev_remove_device(char *path, char *subsystem) { - struct udevice *dev; + struct udevice dev; char *temp; int retval; - dev = malloc(sizeof(*dev)); - if (dev == NULL) - return -ENOMEM; - memset(dev, 0, sizeof(*dev)); + memset(&dev, 0, sizeof(dev)); - retval = udevdb_get_dev(path, 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; - strncpy(dev->name, &temp[1], sizeof(dev->name)); + strfieldcpy(dev.name, &temp[1]); } - dbg("name is '%s'", dev->name); + dbg("name is '%s'", dev.name); udevdb_delete_dev(path); - sysbus_send_remove(dev->name, path); + sysbus_send_remove(dev.name, path); - retval = delete_node(dev); - free(dev); + retval = delete_node(&dev); return retval; }