chiark / gitweb /
libvolume_id: squashfs+LZMA compression detection
[elogind.git] / udevinfo.c
index 82057de54c566b9dd8469b7c5bf5583c4e888d95..948aaccc36f95eeb5d436da1d232b9bb35ffe5ed 100644 (file)
 
 #include "udev.h"
 
-
-#ifdef USE_LOG
-void log_message (int priority, const char *format, ...)
-{
-       va_list args;
-
-       if (priority > udev_log_priority)
-               return;
-
-       va_start(args, format);
-       vsyslog(priority, format, args);
-       va_end(args);
-}
-#endif
-
 static void print_all_attributes(const char *devpath, const char *key)
 {
        char path[PATH_SIZE];
@@ -67,6 +52,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 +67,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 */
@@ -216,7 +206,18 @@ out:
        return rc;
 }
 
-int main(int argc, char *argv[], char *envp[])
+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;
        struct udevice *udev;
@@ -229,6 +230,7 @@ int main(int argc, char *argv[], char *envp[])
                { "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' },
                {}
@@ -239,6 +241,7 @@ int main(int argc, char *argv[], char *envp[])
                ACTION_QUERY,
                ACTION_ATTRIBUTE_WALK,
                ACTION_ROOT,
+               ACTION_DEVICE_ID_FILE,
        } action = ACTION_NONE;
 
        enum query_type {
@@ -265,9 +268,8 @@ 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);
+               option = getopt_long(argc, argv, "aed:n:p:q:rVh", options, NULL);
                if (option == -1)
                        break;
 
@@ -279,7 +281,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 */
@@ -287,10 +289,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;
@@ -320,6 +321,10 @@ int main(int argc, char *argv[], char *envp[])
                                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;
@@ -333,21 +338,21 @@ int main(int argc, char *argv[], char *envp[])
                        printf("udevinfo, version %s\n", UDEV_VERSION);
                        goto exit;
                case 'h':
-                       printf("Usage: udevinfo 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"
+                       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"
+                              "  --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:
@@ -385,15 +390,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);
@@ -434,6 +438,10 @@ int main(int argc, char *argv[], char *envp[])
                        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;