summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-10-11 10:53:56 +0200
committerLennart Poettering <lennart@poettering.net>2021-10-11 10:58:50 +0200
commit6bfd44ee04515ce0a506ab88b91ca332ca35dedd (patch)
tree3bd840fd974a093c1ecd743bb342c255910647e9
parent54ccd706badc4319a5491028efb2772b7ffdfe90 (diff)
downloadsystemd-6bfd44ee04515ce0a506ab88b91ca332ca35dedd.tar.gz
fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair
-rw-r--r--src/basic/fileio.c19
-rw-r--r--src/basic/fileio.h5
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);
}