diff options
author | Lennart Poettering <lennart@poettering.net> | 2021-10-11 10:53:56 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2021-10-11 10:58:50 +0200 |
commit | 6bfd44ee04515ce0a506ab88b91ca332ca35dedd (patch) | |
tree | 3bd840fd974a093c1ecd743bb342c255910647e9 | |
parent | 54ccd706badc4319a5491028efb2772b7ffdfe90 (diff) | |
download | systemd-6bfd44ee04515ce0a506ab88b91ca332ca35dedd.tar.gz |
fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair
-rw-r--r-- | src/basic/fileio.c | 19 | ||||
-rw-r--r-- | src/basic/fileio.h | 5 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 0a483854f2..09c72830c2 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 899def946b..cea3dd893d 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); } |