From 5545141758dc0e4f1db7e185024a2af162a8e742 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 26 Sep 2022 10:15:03 +0200 Subject: fs-util: Add chown_and_chmod_at() --- src/basic/fs-util.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/basic/fs-util.c') diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 6b757bd570..3238ff02f7 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -195,17 +195,17 @@ int readlink_and_make_absolute(const char *p, char **r) { return 0; } -int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid) { +int chmod_and_chown_at(int dir_fd, const char *path, mode_t mode, uid_t uid, gid_t gid) { _cleanup_close_ int fd = -1; - assert(path); - - fd = open(path, O_PATH|O_CLOEXEC|O_NOFOLLOW); /* Let's acquire an O_PATH fd, as precaution to change - * mode/owner on the same file */ - if (fd < 0) - return -errno; + if (path) { + /* Let's acquire an O_PATH fd, as precaution to change mode/owner on the same file */ + fd = openat(dir_fd, path, O_PATH|O_CLOEXEC|O_NOFOLLOW); + if (fd < 0) + return -errno; + } - return fchmod_and_chown(fd, mode, uid, gid); + return fchmod_and_chown(path ? fd : dir_fd, mode, uid, gid); } int fchmod_and_chown_with_fallback(int fd, const char *path, mode_t mode, uid_t uid, gid_t gid) { -- cgit v1.2.1