chiark / gitweb /
udevadm: settle - make --timeout=0 working
[elogind.git] / udev / udevadm-info.c
index 6fe1f8631328932f6aa64ffb16bd91e1d862ef40..b743a1d642faa0f741e982c00c5a95b5ba3c24ef 100644 (file)
@@ -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;
@@ -153,6 +150,10 @@ static void print_record(struct udev_device *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]);
@@ -198,8 +199,7 @@ static int export_devices(struct udev *udev)
 
                device = udev_device_new_from_syspath(udev, udev_list_entry_get_name(list_entry));
                if (device != NULL) {
-                       if (udev_device_get_devnode(device) != NULL)
-                               print_record(device);
+                       print_record(device);
                        udev_device_unref(device);
                }
        }
@@ -267,13 +267,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");
@@ -306,12 +303,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) {
@@ -352,7 +347,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;
@@ -384,8 +379,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
                               "                             of parent devices\n"
                               "  --device-id-of-file=<file> print major:minor of device containing this file\n"
                               "  --export-db                export the content of the udev database\n"
-                              "  --help                     print this text\n"
-                              "\n");
+                              "  --help\n\n");
                        goto exit;
                default:
                        goto exit;