chiark / gitweb /
while (1) -> for (;;)
[elogind.git] / udev / udevadm-info.c
index f20eb07e046bd462f576c45967746e21f368428c..14baa6accb79c979e984f267623d649a6bec6806 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004-2008 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2004-2009 Kay Sievers <kay.sievers@vrfy.org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 #include <dirent.h>
 #include <errno.h>
 #include <getopt.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
@@ -40,7 +41,6 @@ static void print_all_attributes(struct udev_device *device, const char *key)
        if (dir != NULL) {
                for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
                        struct stat statbuf;
-                       char filename[UTIL_PATH_SIZE];
                        const char *value;
                        size_t len;
 
@@ -52,10 +52,7 @@ static void print_all_attributes(struct udev_device *device, const char *key)
                        if (strcmp(dent->d_name, "dev") == 0)
                                continue;
 
-                       util_strlcpy(filename, udev_device_get_syspath(device), sizeof(filename));
-                       util_strlcat(filename, "/", sizeof(filename));
-                       util_strlcat(filename, dent->d_name, sizeof(filename));
-                       if (lstat(filename, &statbuf) != 0)
+                       if (fstatat(dirfd(dir), dent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0)
                                continue;
                        if (S_ISLNK(statbuf.st_mode))
                                continue;
@@ -63,7 +60,7 @@ static void print_all_attributes(struct udev_device *device, const char *key)
                        value = udev_device_get_sysattr_value(device, dent->d_name);
                        if (value == NULL)
                                continue;
-                       dbg(udev, "attr '%s'='%s'(%zi)\n", dent->d_name, value, len);
+                       dbg(udev, "attr '%s'='%s'\n", dent->d_name, value);
 
                        /* skip nonprintable attributes */
                        len = strlen(value);
@@ -145,18 +142,6 @@ static void print_record(struct udev_device *device)
        if (i != 0)
                printf("L: %i\n", i);
 
-       i = udev_device_get_num_fake_partitions(device);
-       if (i != 0)
-               printf("A:%u\n", i);
-
-       i = udev_device_get_ignore_remove(device);
-       if (i != 0)
-               printf("R:%u\n", i);
-
-       i = udev_device_get_watch_handle(device);
-       if (i >= 0)
-               printf("W:%u\n", i);
-
        udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(device)) {
                len = strlen(udev_get_dev_path(udev_device_get_udev(device)));
                printf("S: %s\n", &udev_list_entry_get_name(list_entry)[len+1]);
@@ -249,11 +234,11 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                QUERY_NAME,
                QUERY_PATH,
                QUERY_SYMLINK,
-               QUERY_ENV,
+               QUERY_PROPERTY,
                QUERY_ALL,
        } query = QUERY_NONE;
 
-       while (1) {
+       for (;;) {
                int option;
                struct stat statbuf;
 
@@ -270,13 +255,10 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                                goto exit;
                        }
                        /* remove /dev if given */
-                       if (strncmp(optarg, udev_get_dev_path(udev), strlen(udev_get_dev_path(udev))) != 0) {
-                               util_strlcpy(name, udev_get_dev_path(udev), sizeof(name));
-                               util_strlcat(name, "/", sizeof(name));
-                               util_strlcat(name, optarg, sizeof(name));
-                       } else {
-                               util_strlcpy(name, optarg, sizeof(name));
-                       }
+                       if (strncmp(optarg, udev_get_dev_path(udev), strlen(udev_get_dev_path(udev))) != 0)
+                               util_strscpyl(name, sizeof(name), udev_get_dev_path(udev), "/", optarg, NULL);
+                       else
+                               util_strscpy(name, sizeof(name), optarg);
                        util_remove_trailing_chars(name, '/');
                        if (stat(name, &statbuf) < 0) {
                                fprintf(stderr, "device node not found\n");
@@ -309,12 +291,10 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                                goto exit;
                        }
                        /* add sys dir if needed */
-                       if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0) {
-                               util_strlcpy(path, udev_get_sys_path(udev), sizeof(path));
-                               util_strlcat(path, optarg, sizeof(path));
-                       } else {
-                               util_strlcpy(path, optarg, sizeof(path));
-                       }
+                       if (strncmp(optarg, udev_get_sys_path(udev), strlen(udev_get_sys_path(udev))) != 0)
+                               util_strscpyl(path, sizeof(path), udev_get_sys_path(udev), optarg, NULL);
+                       else
+                               util_strscpy(path, sizeof(path), optarg);
                        util_remove_trailing_chars(path, '/');
                        device = udev_device_new_from_syspath(udev, path);
                        if (device == NULL) {
@@ -325,29 +305,22 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                        break;
                case 'q':
                        action = ACTION_QUERY;
-                       if (strcmp(optarg, "name") == 0) {
+                       if (strcmp(optarg, "property") == 0 || strcmp(optarg, "env") == 0) {
+                               query = QUERY_PROPERTY;
+                       } else if (strcmp(optarg, "name") == 0) {
                                query = QUERY_NAME;
-                               break;
-                       }
-                       if (strcmp(optarg, "symlink") == 0) {
+                       } else if (strcmp(optarg, "symlink") == 0) {
                                query = QUERY_SYMLINK;
-                               break;
-                       }
-                       if (strcmp(optarg, "path") == 0) {
+                       } else if (strcmp(optarg, "path") == 0) {
                                query = QUERY_PATH;
-                               break;
-                       }
-                       if (strcmp(optarg, "env") == 0) {
-                               query = QUERY_ENV;
-                               break;
-                       }
-                       if (strcmp(optarg, "all") == 0) {
+                       } else if (strcmp(optarg, "all") == 0) {
                                query = QUERY_ALL;
-                               break;
+                       } else {
+                               fprintf(stderr, "unknown query type\n");
+                               rc = 3;
+                               goto exit;
                        }
-                       fprintf(stderr, "unknown query type\n");
-                       rc = 3;
-                       goto exit;
+                       break;
                case 'r':
                        if (action == ACTION_NONE)
                                action = ACTION_ROOT;
@@ -355,7 +328,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                        break;
                case 'd':
                        action = ACTION_DEVICE_ID_FILE;
-                       util_strlcpy(name, optarg, sizeof(name));
+                       util_strscpy(name, sizeof(name), optarg);
                        break;
                case 'a':
                        action = ACTION_ATTRIBUTE_WALK;
@@ -378,7 +351,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                               "      name                     name of device node\n"
                               "      symlink                  pointing to node\n"
                               "      path                     sys device path\n"
-                              "      env                      the device related imported environment\n"
+                              "      property                 the device properties\n"
                               "      all                      all values\n"
                               "  --path=<syspath>           sys device path used for query or attribute walk\n"
                               "  --name=<name>              node or symlink name used for query or attribute walk\n"
@@ -403,23 +376,24 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                }
 
                switch(query) {
-               case QUERY_NAME:
+               case QUERY_NAME: {
+                       const char *node = udev_device_get_devnode(device);
+
+                       if (node == NULL) {
+                               fprintf(stderr, "no device node found\n");
+                               rc = 5;
+                               goto exit;
+                       }
+
                        if (root) {
                                printf("%s\n", udev_device_get_devnode(device));
                        } else {
-                               size_t len;
-                               const char *node;
-
-                               len = strlen(udev_get_dev_path(udev));
-                               node = udev_device_get_devnode(device);
-                               if (node == NULL) {
-                                       fprintf(stderr, "no device node found\n");
-                                       rc = 5;
-                                       goto exit;
-                               }
-                                       printf("%s\n", &udev_device_get_devnode(device)[len+1]);
+                               size_t len = strlen(udev_get_dev_path(udev));
+
+                               printf("%s\n", &udev_device_get_devnode(device)[len+1]);
                        }
                        break;
+               }
                case QUERY_SYMLINK:
                        list_entry = udev_device_get_devlinks_list_entry(device);
                        while (list_entry != NULL) {
@@ -440,7 +414,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                case QUERY_PATH:
                        printf("%s\n", udev_device_get_devpath(device));
                        goto exit;
-               case QUERY_ENV:
+               case QUERY_PROPERTY:
                        list_entry = udev_device_get_properties_list_entry(device);
                        while (list_entry != NULL) {
                                printf("%s=%s\n", udev_list_entry_get_name(list_entry), udev_list_entry_get_value(list_entry));