]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: let stack_directory_open() convert a slink into a dirname itself
authorFranck Bui <fbui@suse.com>
Wed, 14 Dec 2022 18:04:16 +0000 (19:04 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 13 Jan 2023 02:16:14 +0000 (11:16 +0900)
We likely always want to open the directory via a slink.

There's currently only one caller so it doesn't make any difference in practice
but I think it's still nicer.

No functional change.

src/udev/udev-node.c

index ef6f604478af7760946412ba5aa41e1045bcfb9f..47761289334bfbe329f1e0193527306119728ca1 100644 (file)
@@ -11,6 +11,7 @@
 #include "dirent-util.h"
 #include "escape.h"
 #include "fd-util.h"
+#include "fileio.h"
 #include "format-util.h"
 #include "fs-util.h"
 #include "hexdecoct.h"
@@ -175,14 +176,14 @@ static int stack_directory_read_one(int dirfd, const char *id, bool is_symlink,
         return 1; /* Updated */
 }
 
-static int stack_directory_find_prioritized_devnode(sd_device *dev, const char *dirname, bool add, char **ret) {
+static int stack_directory_find_prioritized_devnode(sd_device *dev, int dirfd, bool add, char **ret) {
         _cleanup_closedir_ DIR *dir = NULL;
         _cleanup_free_ char *devnode = NULL;
         int r, priority = 0;
         const char *id;
 
         assert(dev);
-        assert(dirname);
+        assert(dirfd >= 0);
         assert(ret);
 
         /* Find device node of device with highest priority. This returns 1 if a device found, 0 if no
@@ -204,7 +205,7 @@ static int stack_directory_find_prioritized_devnode(sd_device *dev, const char *
                         return -ENOMEM;
         }
 
-        dir = opendir(dirname);
+        dir = xopendirat(dirfd, ".", O_NOFOLLOW);
         if (!dir)
                 return -errno;
 
@@ -223,9 +224,9 @@ static int stack_directory_find_prioritized_devnode(sd_device *dev, const char *
                 if (!IN_SET(de->d_type, DT_LNK, DT_REG))
                         continue;
 
-                r = stack_directory_read_one(dirfd(dir), de->d_name, /* is_symlink = */ de->d_type == DT_LNK, &devnode, &priority);
+                r = stack_directory_read_one(dirfd, de->d_name, /* is_symlink = */ de->d_type == DT_LNK, &devnode, &priority);
                 if (r < 0) {
-                        log_debug_errno(r, "Failed to read '%s/%s', ignoring: %m", dirname, de->d_name);
+                        log_debug_errno(r, "Failed to read '%s', ignoring: %m", de->d_name);
                         continue;
                 }
         }
@@ -353,15 +354,20 @@ static int stack_directory_get_name(const char *slink, char **ret) {
         return 0;
 }
 
-static int stack_directory_open(sd_device *dev, const char *dirname, int *ret_dirfd, int *ret_lockfd) {
+static int stack_directory_open(sd_device *dev, const char *slink, int *ret_dirfd, int *ret_lockfd) {
         _cleanup_close_ int dirfd = -EBADF, lockfd = -EBADF;
+        _cleanup_free_ char *dirname = NULL;
         int r;
 
         assert(dev);
-        assert(dirname);
+        assert(slink);
         assert(ret_dirfd);
         assert(ret_lockfd);
 
+        r = stack_directory_get_name(slink, &dirname);
+        if (r < 0)
+                return log_device_debug_errno(dev, r, "Failed to build stack directory name for '%s': %m", slink);
+
         r = mkdir_parents(dirname, 0755);
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to create stack directory '%s': %m", dirname);
@@ -375,7 +381,7 @@ static int stack_directory_open(sd_device *dev, const char *dirname, int *ret_di
                 return log_device_debug_errno(dev, errno, "Failed to create lock file for stack directory '%s': %m", dirname);
 
         if (flock(lockfd, LOCK_EX) < 0)
-                return log_device_debug_errno(dev, errno, "Failed to place a lock on lock file for '%s': %m", dirname);
+                return log_device_debug_errno(dev, errno, "Failed to place a lock on lock file for %s: %m", dirname);
 
         *ret_dirfd = TAKE_FD(dirfd);
         *ret_lockfd = TAKE_FD(lockfd);
@@ -383,26 +389,22 @@ static int stack_directory_open(sd_device *dev, const char *dirname, int *ret_di
 }
 
 static int link_update(sd_device *dev, const char *slink, bool add) {
-        _cleanup_free_ char *dirname = NULL, *devnode = NULL;
         _cleanup_close_ int dirfd = -EBADF, lockfd = -EBADF;
+        _cleanup_free_ char *devnode = NULL;
         int r;
 
         assert(dev);
         assert(slink);
 
-        r = stack_directory_get_name(slink, &dirname);
-        if (r < 0)
-                return log_device_debug_errno(dev, r, "Failed to build stack directory name for '%s': %m", slink);
-
-        r = stack_directory_open(dev, dirname, &dirfd, &lockfd);
+        r = stack_directory_open(dev, slink, &dirfd, &lockfd);
         if (r < 0)
                 return r;
 
         r = stack_directory_update(dev, dirfd, add);
         if (r < 0)
-                return log_device_debug_errno(dev, r, "Failed to update stack directory '%s': %m", dirname);
+                return log_device_debug_errno(dev, r, "Failed to update stack directory for '%s': %m", slink);
 
-        r = stack_directory_find_prioritized_devnode(dev, dirname, add, &devnode);
+        r = stack_directory_find_prioritized_devnode(dev, dirfd, add, &devnode);
         if (r < 0)
                 return log_device_debug_errno(dev, r, "Failed to determine device node with the highest priority for '%s': %m", slink);
         if (r > 0)