]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
recurse-dir: give callers of recurse_dir_at() control over path prefix
authorLennart Poettering <lennart@poettering.net>
Tue, 23 Nov 2021 21:18:31 +0000 (22:18 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 24 Nov 2021 08:34:10 +0000 (09:34 +0100)
One of the niceties of recurse_dir()/recurse_dir_at() is that the path
argument is decoration, it's not used for actually accessing the fs in
anyway. That's very handy in environments where chroots and relative
paths are used, as we can path in any path we like and the recursion
function will suffix with whatever it discovers but will not try to make
sense of the prefix you pass.

This works great, except that the recurse_dir_at() wrapper broke that:
it adjusted the path if NULL to "." simply for the sake of making
openat() on the top work. Let's make this adjustment more local and do
it only for the openat() itself, and otherwise pass the path through the
way we got it. This means: if a caller really wants the paths that are
concatenated to start with a "." it can just pass that. This way the
caller gets full control back of the path prefix. Win!

Note that all current users of recurse_dir_at() don't pass NULL as
second arg, hence this check is without any real effect for now. It's
preparation for future uses however.

src/basic/recurse-dir.c

index d1fee91c3294322d5dbb70c9ec677367037b455c..efa1797b7bab73816adee78858c546a1fbf24ca8 100644 (file)
@@ -444,10 +444,7 @@ int recurse_dir_at(
         assert(atfd >= 0 || atfd == AT_FDCWD);
         assert(func);
 
-        if (!path)
-                path = ".";
-
-        fd = openat(atfd, path, O_DIRECTORY|O_CLOEXEC);
+        fd = openat(atfd, path ?: ".", O_DIRECTORY|O_CLOEXEC);
         if (fd < 0)
                 return -errno;