chiark / gitweb /
[PATCH] udev add wild card compare for ID
[elogind.git] / namedev.c
index 7984adfb31d87fc1d42ebcefe7e9d4576cdfba24..e4e585b5cd64b5676a3261a736c6b620f3a6dad5 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -313,6 +313,19 @@ exit:
        return; /* here to prevent compiler warning... */
 }
 
+static void fix_kernel_name(struct udevice *udev)
+{
+       char *temp = udev->kernel_name;
+
+       while (*temp != 0x00) {
+               /* Some block devices have a ! in their name, 
+                * we need to change that to / */
+               if (*temp == '!')
+                       *temp = '/';
+               ++temp;
+       }
+}
+
 static int execute_program(char *path, char *value, int len)
 {
        int retval;
@@ -456,32 +469,20 @@ static int match_sysfs_pairs(struct config_device *dev, struct sysfs_class_devic
 static int match_id(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
 {
        char path[SYSFS_PATH_MAX];
-       int found;
        char *temp = NULL;
 
        /* we have to have a sysfs device for ID to work */
        if (!sysfs_device)
                return -ENODEV;
 
-       found = 0;
        strfieldcpy(path, sysfs_device->path);
        temp = strrchr(path, '/');
+       temp++;
        dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
-       if (strstr(temp, dev->id) != NULL) {
-               found = 1;
-       } else {
-               *temp = 0x00;
-               temp = strrchr(path, '/');
-               dbg("search '%s' in '%s', path='%s'", dev->id, temp, path);
-               if (strstr(temp, dev->id) != NULL)
-                       found = 1;
-       }
-       if (!found) {
-               dbg("id doesn't match");
+       if (strcmp_pattern(dev->id, temp) != 0)
                return -ENODEV;
-       }
-
-       return 0;
+       else
+               return 0;
 }
 
 static int match_place(struct config_device *dev, struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device)
@@ -701,11 +702,12 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud
                dbg("sysfs_device->bus='%s'", sysfs_device->bus);
                strfieldcpy(udev->bus_id, sysfs_device->bus_id);
                wait_for_device_to_initialize(sysfs_device);
-       } else {
-               dbg("class_dev->name = '%s'", class_dev->name);
        }
+       dbg("class_dev->name = '%s'", class_dev->name);
 
        strfieldcpy(udev->kernel_name, class_dev->name);
+       fix_kernel_name(udev);
+       dbg("udev->kernel_name = '%s'", udev->kernel_name);
 
        /* get kernel number */
        pos = class_dev->name + strlen(class_dev->name);