chiark / gitweb /
use openat(), unlinkat(), fstatat()
[elogind.git] / udev / udevadm-info.c
index f20eb07e046bd462f576c45967746e21f368428c..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;
@@ -270,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");
@@ -309,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) {
@@ -355,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;