chiark / gitweb /
volume_id: clean up linux_raid code
[elogind.git] / udevinfo.c
index fc45f7565d192e778173b15bc9d293c69ce62dd8..b8e97c40746ddb051c3dfa2725a8254ad77f1f33 100644 (file)
@@ -54,6 +54,8 @@ static void print_all_attributes(const char *devpath, const char *key)
 
                        if (strcmp(dent->d_name, "uevent") == 0)
                                continue;
 
                        if (strcmp(dent->d_name, "uevent") == 0)
                                continue;
+                       if (strcmp(dent->d_name, "dev") == 0)
+                               continue;
 
                        strlcpy(filename, path, sizeof(filename));
                        strlcat(filename, "/", sizeof(filename));
 
                        strlcpy(filename, path, sizeof(filename));
                        strlcat(filename, "/", sizeof(filename));
@@ -69,7 +71,7 @@ static void print_all_attributes(const char *devpath, const char *key)
                        len = strlcpy(value, attr_value, sizeof(value));
                        if(len >= sizeof(value))
                                len = sizeof(value) - 1;
                        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);
+                       dbg("attr '%s'='%s'(%zi)\n", dent->d_name, value, len);
 
                        /* remove trailing newlines */
                        while (len && value[len-1] == '\n')
 
                        /* remove trailing newlines */
                        while (len && value[len-1] == '\n')
@@ -79,11 +81,10 @@ static void print_all_attributes(const char *devpath, const char *key)
                        while (len && isprint(value[len-1]))
                                len--;
                        if (len) {
                        while (len && isprint(value[len-1]))
                                len--;
                        if (len) {
-                               dbg("attribute value of '%s' non-printable, skip", dent->d_name);
+                               dbg("attribute value of '%s' non-printable, skip\n", dent->d_name);
                                continue;
                        }
 
                                continue;
                        }
 
-                       replace_chars(value, ALLOWED_CHARS_INPUT);
                        printf("    %s{%s}==\"%s\"\n", key, dent->d_name, value);
                }
        }
                        printf("    %s{%s}==\"%s\"\n", key, dent->d_name, value);
                }
        }
@@ -176,7 +177,7 @@ static int lookup_device_by_name(struct udevice *udev, const char *name)
        if (count <= 0)
                goto out;
 
        if (count <= 0)
                goto out;
 
-       info("found %i devices for '%s'", count, name);
+       info("found %i devices for '%s'\n", count, name);
 
        /* select the device that seems to match */
        list_for_each_entry(device, &name_list, node) {
 
        /* select the device that seems to match */
        list_for_each_entry(device, &name_list, node) {
@@ -186,7 +187,7 @@ static int lookup_device_by_name(struct udevice *udev, const char *name)
                udev_device_init(udev);
                if (udev_db_get_device(udev, device->name) != 0)
                        continue;
                udev_device_init(udev);
                if (udev_db_get_device(udev, device->name) != 0)
                        continue;
-               info("found db entry '%s'", device->name);
+               info("found db entry '%s'\n", device->name);
 
                /* make sure, we don't get a link of a differnt device */
                strlcpy(filename, udev_root, sizeof(filename));
 
                /* make sure, we don't get a link of a differnt device */
                strlcpy(filename, udev_root, sizeof(filename));
@@ -195,7 +196,7 @@ static int lookup_device_by_name(struct udevice *udev, const char *name)
                if (stat(filename, &statbuf) != 0)
                        continue;
                if (major(udev->devt) > 0 && udev->devt != statbuf.st_rdev) {
                if (stat(filename, &statbuf) != 0)
                        continue;
                if (major(udev->devt) > 0 && udev->devt != statbuf.st_rdev) {
-                       info("skip '%s', dev_t doesn't match", udev->name);
+                       info("skip '%s', dev_t doesn't match\n", udev->name);
                        continue;
                }
                rc = 0;
                        continue;
                }
                rc = 0;
@@ -206,6 +207,17 @@ out:
        return rc;
 }
 
        return rc;
 }
 
+static int stat_device(const char *name)
+{
+       struct stat statbuf;
+
+       if (stat(name, &statbuf) != 0)
+               return -1;
+
+       printf("%d %d\n", major(statbuf.st_dev), minor(statbuf.st_dev));
+       return 0;
+}
+
 int udevinfo(int argc, char *argv[], char *envp[])
 {
        int option;
 int udevinfo(int argc, char *argv[], char *envp[])
 {
        int option;
@@ -219,6 +231,7 @@ int udevinfo(int argc, char *argv[], char *envp[])
                { "attribute-walk", 0, NULL, 'a' },
                { "export-db", 0, NULL, 'e' },
                { "root", 0, NULL, 'r' },
                { "attribute-walk", 0, NULL, 'a' },
                { "export-db", 0, NULL, 'e' },
                { "root", 0, NULL, 'r' },
+               { "device-id-of-file", 1, NULL, 'd' },
                { "version", 0, NULL, 1 }, /* -V outputs braindead format */
                { "help", 0, NULL, 'h' },
                {}
                { "version", 0, NULL, 1 }, /* -V outputs braindead format */
                { "help", 0, NULL, 'h' },
                {}
@@ -229,6 +242,7 @@ int udevinfo(int argc, char *argv[], char *envp[])
                ACTION_QUERY,
                ACTION_ATTRIBUTE_WALK,
                ACTION_ROOT,
                ACTION_QUERY,
                ACTION_ATTRIBUTE_WALK,
                ACTION_ROOT,
+               ACTION_DEVICE_ID_FILE,
        } action = ACTION_NONE;
 
        enum query_type {
        } action = ACTION_NONE;
 
        enum query_type {
@@ -256,11 +270,11 @@ int udevinfo(int argc, char *argv[], char *envp[])
        }
 
        while (1) {
        }
 
        while (1) {
-               option = getopt_long(argc, argv, "aen:p:q:rVh", options, NULL);
+               option = getopt_long(argc, argv, "aed:n:p:q:rVh", options, NULL);
                if (option == -1)
                        break;
 
                if (option == -1)
                        break;
 
-               dbg("option '%c'", option);
+               dbg("option '%c'\n", option);
                switch (option) {
                case 'n':
                        /* remove /dev if given */
                switch (option) {
                case 'n':
                        /* remove /dev if given */
@@ -268,7 +282,8 @@ int udevinfo(int argc, char *argv[], char *envp[])
                                strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name));
                        else
                                strlcpy(name, optarg, sizeof(name));
                                strlcpy(name, &optarg[strlen(udev_root)+1], sizeof(name));
                        else
                                strlcpy(name, optarg, sizeof(name));
-                       dbg("name: %s", name);
+                       remove_trailing_chars(name, '/');
+                       dbg("name: %s\n", name);
                        break;
                case 'p':
                        /* remove /sys if given */
                        break;
                case 'p':
                        /* remove /sys if given */
@@ -276,7 +291,28 @@ int udevinfo(int argc, char *argv[], char *envp[])
                                strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path));
                        else
                                strlcpy(path, optarg, sizeof(path));
                                strlcpy(path, &optarg[strlen(sysfs_path)], sizeof(path));
                        else
                                strlcpy(path, optarg, sizeof(path));
-                       dbg("path: %s", path);
+                       remove_trailing_chars(path, '/');
+
+                       /* possibly resolve to real devpath */
+                       if (sysfs_resolve_link(path, sizeof(path)) != 0) {
+                               char temp[PATH_SIZE];
+                               char *pos;
+
+                               /* also check if the parent is a link */
+                               strlcpy(temp, path, sizeof(temp));
+                               pos = strrchr(temp, '/');
+                               if (pos != 0) {
+                                       char tail[PATH_SIZE];
+
+                                       strlcpy(tail, pos, sizeof(tail));
+                                       pos[0] = '\0';
+                                       if (sysfs_resolve_link(temp, sizeof(temp)) == 0) {
+                                               strlcpy(path, temp, sizeof(path));
+                                               strlcat(path, tail, sizeof(path));
+                                       }
+                               }
+                       }
+                       dbg("path: %s\n", path);
                        break;
                case 'q':
                        action = ACTION_QUERY;
                        break;
                case 'q':
                        action = ACTION_QUERY;
@@ -308,6 +344,10 @@ int udevinfo(int argc, char *argv[], char *envp[])
                                action = ACTION_ROOT;
                        root = 1;
                        break;
                                action = ACTION_ROOT;
                        root = 1;
                        break;
+               case 'd':
+                       action = ACTION_DEVICE_ID_FILE;
+                       strlcpy(name, optarg, sizeof(name));
+                       break;
                case 'a':
                        action = ACTION_ATTRIBUTE_WALK;
                        break;
                case 'a':
                        action = ACTION_ATTRIBUTE_WALK;
                        break;
@@ -322,20 +362,20 @@ int udevinfo(int argc, char *argv[], char *envp[])
                        goto exit;
                case 'h':
                        printf("Usage: udevadm info OPTIONS\n"
                        goto exit;
                case 'h':
                        printf("Usage: udevadm info OPTIONS\n"
-                              "  --query=<type>    query database for the specified value:\n"
-                              "    name            name of device node\n"
-                              "    symlink         pointing to node\n"
-                              "    path            sysfs device path\n"
-                              "    env             the device related imported environment\n"
-                              "    all             all values\n"
-                              "\n"
-                              "  --path=<devpath>  sysfs device path used for query or chain\n"
-                              "  --name=<name>     node or symlink name used for query\n"
-                              "\n"
-                              "  --root            prepend to query result or print udev_root\n"
-                              "  --attribute-walk  print all SYSFS_attributes along the device chain\n"
-                              "  --export-db       export the content of the udev database\n"
-                              "  --help            print this text\n"
+                              "  --query=<type>             query database for the specified value:\n"
+                              "      name                     name of device node\n"
+                              "      symlink                  pointing to node\n"
+                              "      path                     sysfs device path\n"
+                              "      env                      the device related imported environment\n"
+                              "      all                      all values\n"
+                              "  --path=<devpath>           sysfs device path used for query or chain\n"
+                              "  --name=<name>              node or symlink name used for query\n"
+                              "  --root                     prepend to query result or print udev_root\n"
+                              "  --attribute-walk           print all key matches while walking along chain\n"
+                              "                             of parent devices\n"
+                              "  --device-id-of-file=<file> print major/minor of underlying device\n"
+                              "  --export-db                export the content of the udev database\n"
+                              "  --help                     print this text\n"
                               "\n");
                        goto exit;
                default:
                               "\n");
                        goto exit;
                default:
@@ -421,6 +461,10 @@ int udevinfo(int argc, char *argv[], char *envp[])
                        goto exit;
                }
                break;
                        goto exit;
                }
                break;
+       case ACTION_DEVICE_ID_FILE:
+               if (stat_device(name) != 0)
+                       rc = 6;
+               break;
        case ACTION_ROOT:
                printf("%s\n", udev_root);
                break;
        case ACTION_ROOT:
                printf("%s\n", udev_root);
                break;