Skip to content

Commit 6bfd44e

Browse files
committed
fileio: add read_virtual_file_at() flavour that takes dir_fd/path pair
1 parent 54ccd70 commit 6bfd44e

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/basic/fileio.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,12 +547,25 @@ int read_virtual_file_fd(int fd, size_t max_size, char **ret_contents, size_t *r
547547
return !truncated;
548548
}
549549

550-
int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size) {
550+
int read_virtual_file_at(
551+
int dir_fd,
552+
const char *filename,
553+
size_t max_size,
554+
char **ret_contents,
555+
size_t *ret_size) {
556+
551557
_cleanup_close_ int fd = -1;
552558

553-
assert(filename);
559+
assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
560+
561+
if (!filename) {
562+
if (dir_fd == AT_FDCWD)
563+
return -EBADF;
564+
565+
return read_virtual_file_fd(dir_fd, max_size, ret_contents, ret_size);
566+
}
554567

555-
fd = open(filename, O_RDONLY | O_NOCTTY | O_CLOEXEC);
568+
fd = openat(dir_fd, filename, O_RDONLY | O_NOCTTY | O_CLOEXEC);
556569
if (fd < 0)
557570
return -errno;
558571

src/basic/fileio.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ static inline int read_full_file(const char *filename, char **ret_contents, size
6969
}
7070

7171
int read_virtual_file_fd(int fd, size_t max_size, char **ret_contents, size_t *ret_size);
72-
int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size);
72+
int read_virtual_file_at(int dir_fd, const char *filename, size_t max_size, char **ret_contents, size_t *ret_size);
73+
static inline int read_virtual_file(const char *filename, size_t max_size, char **ret_contents, size_t *ret_size) {
74+
return read_virtual_file_at(AT_FDCWD, filename, max_size, ret_contents, ret_size);
75+
}
7376
static inline int read_full_virtual_file(const char *filename, char **ret_contents, size_t *ret_size) {
7477
return read_virtual_file(filename, SIZE_MAX, ret_contents, ret_size);
7578
}

0 commit comments

Comments
 (0)