From: Lennart Poettering Date: Mon, 11 Oct 2021 08:53:56 +0000 (+0200) Subject: fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair X-Git-Tag: v250-rc1~538^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6bfd44ee04515ce0a506ab88b91ca332ca35dedd;p=thirdparty%2Fsystemd.git fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 0a483854f2a..09c72830c26 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -547,12 +547,25 @@ int read_virtual_file_fd(int fd, size_t max_size, char **ret_contents, size_t *r return !truncated; } -int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size) { +int read_virtual_file_at( + int dir_fd, + const char *filename, + size_t max_size, + char **ret_contents, + size_t *ret_size) { + _cleanup_close_ int fd = -1; - assert(filename); + assert(dir_fd >= 0 || dir_fd == AT_FDCWD); + + if (!filename) { + if (dir_fd == AT_FDCWD) + return -EBADF; + + return read_virtual_file_fd(dir_fd, max_size, ret_contents, ret_size); + } - fd = open(filename, O_RDONLY | O_NOCTTY | O_CLOEXEC); + fd = openat(dir_fd, filename, O_RDONLY | O_NOCTTY | O_CLOEXEC); if (fd < 0) return -errno; diff --git a/src/basic/fileio.h b/src/basic/fileio.h index 899def946bd..cea3dd893d1 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -69,7 +69,10 @@ static inline int read_full_file(const char *filename, char **ret_contents, size } int read_virtual_file_fd(int fd, size_t max_size, char **ret_contents, size_t *ret_size); -int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size); +int read_virtual_file_at(int dir_fd, const char *filename, size_t max_size, char **ret_contents, size_t *ret_size); +static inline int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size) { + return read_virtual_file_at(AT_FDCWD, filename, max_size, ret_contents, ret_size); +} static inline int read_full_virtual_file(const char *filename, char **ret_contents, size_t *ret_size) { return read_virtual_file(filename, SIZE_MAX, ret_contents, ret_size); }