chiark / gitweb /
udevinfo: exclude "uevent" file from --attribute-walk
[elogind.git] / udevinfo.c
index 52c49b824f364fc7b6b63936790bf726893da89c..a2bc0136913070d569a62cf87a77d07181ab8977 100644 (file)
@@ -67,6 +67,9 @@ static void print_all_attributes(const char *devpath, const char *key)
                        if (dent->d_name[0] == '.')
                                continue;
 
+                       if (strcmp(dent->d_name, "uevent") == 0)
+                               continue;
+
                        strlcpy(filename, path, sizeof(filename));
                        strlcat(filename, "/", sizeof(filename));
                        strlcat(filename, dent->d_name, sizeof(filename));
@@ -79,6 +82,8 @@ static void print_all_attributes(const char *devpath, const char *key)
                        if (attr_value == NULL)
                                continue;
                        len = strlcpy(value, attr_value, sizeof(value));
+                       if(len >= sizeof(value))
+                               len = sizeof(value) - 1;
                        dbg("attr '%s'='%s'(%zi)", dent->d_name, value, len);
 
                        /* remove trailing newlines */
@@ -93,7 +98,7 @@ static void print_all_attributes(const char *devpath, const char *key)
                                continue;
                        }
 
-                       replace_untrusted_chars(value);
+                       replace_chars(value, ALLOWED_CHARS_INPUT);
                        printf("    %s{%s}==\"%s\"\n", key, dent->d_name, value);
                }
        }
@@ -146,6 +151,12 @@ static void print_record(struct udevice *udev)
        printf("N: %s\n", udev->name);
        list_for_each_entry(name_loop, &udev->symlink_list, node)
                printf("S: %s\n", name_loop->name);
+       if (udev->link_priority != 0)
+               printf("L: %i\n", udev->link_priority);
+       if (udev->partitions != 0)
+               printf("A:%u\n", udev->partitions);
+       if (udev->ignore_remove)
+               printf("R:%u\n", udev->ignore_remove);
        list_for_each_entry(name_loop, &udev->env_list, node)
                printf("E: %s\n", name_loop->name);
 }
@@ -172,13 +183,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;
@@ -188,16 +203,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);
@@ -253,7 +270,6 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
-       /* get command line options */
        while (1) {
                option = getopt_long(argc, argv, "aen:p:q:rVh", options, NULL);
                if (option == -1)
@@ -267,7 +283,7 @@ int main(int argc, char *argv[], char *envp[])
                                strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name));
                        else
                                strlcpy(name, optarg, sizeof(name));
-                       dbg("name: %s\n", name);
+                       dbg("name: %s", name);
                        break;
                case 'p':
                        /* remove /sys if given */
@@ -275,10 +291,9 @@ int main(int argc, char *argv[], char *envp[])
                                strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path));
                        else
                                strlcpy(path, optarg, sizeof(path));
-                       dbg("path: %s\n", path);
+                       dbg("path: %s", path);
                        break;
                case 'q':
-                       dbg("udev query: %s\n", optarg);
                        action = ACTION_QUERY;
                        if (strcmp(optarg, "name") == 0) {
                                query = QUERY_NAME;
@@ -373,15 +388,14 @@ int main(int argc, char *argv[], char *envp[])
                                printf("%s\n", udev->name);
                        break;
                case QUERY_SYMLINK:
-                       if (list_empty(&udev->symlink_list))
-                               goto exit;
-                       if (root)
-                               list_for_each_entry(name_loop, &udev->symlink_list, node)
-                                       printf("%s/%s ", udev_root, name_loop->name);
-                       else
-                               list_for_each_entry(name_loop, &udev->symlink_list, node)
-                                       printf("%s ", name_loop->name);
-                       printf("\n");
+                       list_for_each_entry(name_loop, &udev->symlink_list, node) {
+                               char c = name_loop->node.next != &udev->symlink_list ? ' ' : '\n';
+
+                               if (root)
+                                       printf("%s/%s%c", udev_root, name_loop->name, c);
+                               else
+                                       printf("%s%c", name_loop->name, c);
+                       }
                        break;
                case QUERY_PATH:
                        printf("%s\n", udev->dev->devpath);
@@ -401,7 +415,7 @@ int main(int argc, char *argv[], char *envp[])
        case ACTION_ATTRIBUTE_WALK:
                if (path[0] != '\0') {
                        if (print_device_chain(path) != 0) {
-                               fprintf(stderr, "device not found\n");
+                               fprintf(stderr, "no valid sysfs device found\n");
                                rc = 4;
                                goto exit;
                        }
@@ -412,7 +426,7 @@ int main(int argc, char *argv[], char *envp[])
                                goto exit;
                        }
                        if (print_device_chain(udev->dev->devpath) != 0) {
-                               fprintf(stderr, "device not found\n");
+                               fprintf(stderr, "no valid sysfs device found\n");
                                rc = 4;
                                goto exit;
                        }