]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Oct 2021 08:53:56 +0000 (10:53 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Oct 2021 08:58:50 +0000 (10:58 +0200)
src/basic/fileio.c
src/basic/fileio.h

index 0a483854f2a4ab62dd7e20002314922f2eb74a75..09c72830c26aca518bafa46aff6a31660a0958c8 100644 (file)
@@ -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;
 
index 899def946bd4c4c8ce14b49ca287d10ffab83425..cea3dd893d1f3d10f81f1436027618c4c5000436 100644 (file)
@@ -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);
 }