chiark / gitweb /
[PATCH] small ide-devfs.sh fix
[elogind.git] / udev-remove.c
index 195b9874111b2269e0746082984810bb32722ab1..98c45d6c333650ff4ebb381ad6508e49568cad7b 100644 (file)
@@ -29,8 +29,8 @@
 #include <errno.h>
 
 #include "udev.h"
+#include "udev_lib.h"
 #include "udev_version.h"
-#include "udev_dbus.h"
 #include "logging.h"
 #include "namedev.h"
 #include "udevdb.h"
@@ -103,7 +103,7 @@ static int delete_node(struct udevice *dev)
                delete_path(filename);
 
        foreach_strpart(dev->symlink, " ", pos, len) {
-               strnfieldcpy(linkname, pos, len+1);
+               strfieldcpymax(linkname, pos, len+1);
                strfieldcpy(filename, udev_root);
                strfieldcat(filename, linkname);
 
@@ -135,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;
 }