From 9b906ae48ee658ac4aa425b25933efe87c2477e8 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Sun, 18 Jan 2026 23:04:39 +0100 Subject: [PATCH] fs-util: group access_fd() with access_nofollow() --- src/basic/fs-util.c | 26 +++++++++++++------------- src/basic/fs-util.h | 3 +-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 4ca01c7444..0159934ddb 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -360,6 +360,19 @@ int access_nofollow(const char *path, int mode) { return RET_NERRNO(faccessat(AT_FDCWD, path, mode, AT_SYMLINK_NOFOLLOW)); } +int access_fd(int fd, int mode) { + /* Like access() but operates on an already open fd */ + + if (fd == AT_FDCWD) + return RET_NERRNO(access(".", mode)); + if (fd == XAT_FDROOT) + return RET_NERRNO(access("/", mode)); + + assert(fd >= 0); + + return RET_NERRNO(faccessat(fd, "", mode, AT_EMPTY_PATH)); +} + int touch_fd(int fd, usec_t stamp) { assert(fd >= 0); @@ -697,19 +710,6 @@ char* unlink_and_free(char *p) { return mfree(p); } -int access_fd(int fd, int mode) { - /* Like access() but operates on an already open fd */ - - if (fd == AT_FDCWD) - return RET_NERRNO(access(".", mode)); - if (fd == XAT_FDROOT) - return RET_NERRNO(access("/", mode)); - - assert(fd >= 0); - - return RET_NERRNO(faccessat(fd, "", mode, AT_EMPTY_PATH)); -} - int unlinkat_deallocate(int fd, const char *name, UnlinkDeallocateFlags flags) { _cleanup_close_ int truncate_fd = -EBADF; struct stat st; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index b26674d139..d75c253dbb 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -42,6 +42,7 @@ int fd_warn_permissions(const char *path, int fd); int stat_warn_permissions(const char *path, const struct stat *st); int access_nofollow(const char *path, int mode); +int access_fd(int fd, int mode); int touch_fd(int fd, usec_t stamp); int touch_file(const char *path, bool parents, usec_t stamp, uid_t uid, gid_t gid, mode_t mode); @@ -86,8 +87,6 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free); char* unlink_and_free(char *p); DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free); -int access_fd(int fd, int mode); - typedef enum UnlinkDeallocateFlags { UNLINK_REMOVEDIR = 1 << 0, UNLINK_ERASE = 1 << 1,