fileio: modernize xopendirat() a bit

This commit is contained in:
Lennart Poettering
2025-08-25 11:05:48 +02:00
parent 7b7f0983e0
commit 93dea63fab
4 changed files with 14 additions and 9 deletions

View File

@@ -842,7 +842,7 @@ int chase_and_opendir(const char *path, const char *root, ChaseFlags chase_flags
return r;
assert(path_fd >= 0);
d = xopendirat(path_fd, ".", O_NOFOLLOW);
d = xopendirat(path_fd, /* path= */ NULL, /* flags= */ 0);
if (!d)
return -errno;
@@ -1045,7 +1045,7 @@ int chase_and_opendirat(int dir_fd, const char *path, ChaseFlags chase_flags, ch
return r;
assert(path_fd >= 0);
d = xopendirat(path_fd, ".", O_NOFOLLOW);
d = xopendirat(path_fd, /* path= */ NULL, /* flags= */ 0);
if (!d)
return -errno;

View File

@@ -928,17 +928,22 @@ int get_proc_field(const char *path, const char *key, char **ret) {
}
}
DIR* xopendirat(int dir_fd, const char *name, int flags) {
DIR* xopendirat(int dir_fd, const char *path, int flags) {
_cleanup_close_ int fd = -EBADF;
assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
assert(name);
assert(!(flags & (O_CREAT|O_TMPFILE)));
if (dir_fd == AT_FDCWD && flags == 0)
return opendir(name);
if ((dir_fd == AT_FDCWD || path_is_absolute(path)) &&
(flags &~ O_DIRECTORY) == 0)
return opendir(path);
fd = openat(dir_fd, name, O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags);
if (isempty(path)) {
path = ".";
flags |= O_NOFOLLOW;
}
fd = openat(dir_fd, path, O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|flags);
if (fd < 0)
return NULL;

View File

@@ -92,7 +92,7 @@ int script_get_shebang_interpreter(const char *path, char **ret);
int get_proc_field(const char *path, const char *key, char **ret);
DIR* xopendirat(int dir_fd, const char *name, int flags);
DIR* xopendirat(int dir_fd, const char *path, int flags);
typedef enum XfopenFlags {
XFOPEN_UNLOCKED = 1 << 0, /* call __fsetlocking(FSETLOCKING_BYCALLER) after opened */

View File

@@ -190,7 +190,7 @@ static int stack_directory_find_prioritized_devnode(sd_device *dev, int dirfd, b
return -ENOMEM;
}
dir = xopendirat(dirfd, ".", O_NOFOLLOW);
dir = xopendirat(dirfd, /* path= */ NULL, /* flags= */ 0);
if (!dir)
return -errno;