chiark / gitweb /
udevinfo: relax check for the correct device if looked up by name
authorKay Sievers <kay.sievers@vrfy.org>
Fri, 23 Mar 2007 16:17:18 +0000 (17:17 +0100)
committerKay Sievers <kay.sievers@vrfy.org>
Fri, 23 Mar 2007 16:17:18 +0000 (17:17 +0100)
udev_db.c
udevinfo.c

index 00d68d6d13f125badb08b8a78eca4de802ee309e..7b8d02bf81f895eba55c702a837a4e8f21c7da81 100644 (file)
--- a/udev_db.c
+++ b/udev_db.c
@@ -186,7 +186,7 @@ int udev_db_get_device(struct udevice *udev, const char *devpath)
        size_t cur;
        size_t count;
 
-       strlcpy(udev->dev->devpath, devpath, sizeof(udev->dev->devpath));
+       sysfs_device_set_values(udev->dev, devpath, NULL, NULL);
        devpath_to_db_path(devpath, filename, sizeof(filename));
 
        if (lstat(filename, &stats) != 0) {
index 3f25be03f84b26bac274ec26b111971ca59418c5..4b4876cc11f10e03cad5efb5555da04dc382d116 100644 (file)
@@ -173,13 +173,17 @@ static void export_db(void) {
 static int lookup_device_by_name(struct udevice *udev, const char *name)
 {
        LIST_HEAD(name_list);
+       int count;
        struct name_entry *device;
        int rc  = -1;
 
-       if (udev_db_get_devices_by_name(name, &name_list) <= 0)
+       count = udev_db_get_devices_by_name(name, &name_list);
+       if (count <= 0)
                goto out;
 
-       /* select the device that matches the dev_t of name */
+       info("found %i devices for '%s'", count, name);
+
+       /* select the device that seems to match */
        list_for_each_entry(device, &name_list, node) {
                char filename[PATH_SIZE];
                struct stat statbuf;
@@ -189,16 +193,18 @@ static int lookup_device_by_name(struct udevice *udev, const char *name)
                        continue;
                info("found db entry '%s'", device->name);
 
+               /* make sure, we don't get a link of a differnt device */
                strlcpy(filename, udev_root, sizeof(filename));
                strlcat(filename, "/", sizeof(filename));
                strlcat(filename, name, sizeof(filename));
                if (stat(filename, &statbuf) != 0)
                        continue;
-               if (statbuf.st_rdev == udev->devt) {
-                       info("found '%s', dev_t matches", udev->name);
-                       rc = 0;
-                       break;
+               if (major(udev->devt) > 0 && udev->devt != statbuf.st_rdev) {
+                       info("skip '%s', dev_t doesn't match", udev->name);
+                       continue;
                }
+               rc = 0;
+               break;
        }
 out:
        name_list_cleanup(&name_list);