return 1;
}
-int read_virtual_file_fd(int fd, 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_free_ char *buf = NULL;
size_t n, size;
int n_retries;
* contents* may be returned. (Though the read is still done using one syscall.) Returns 0 on
* partial success, 1 if untruncated contents were read. */
- assert(fd >= 0);
+ assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
assert(max_size <= READ_VIRTUAL_BYTES_MAX || max_size == SIZE_MAX);
+ _cleanup_close_ int fd = -EBADF;
+ if (isempty(filename))
+ fd = fd_reopen(ASSERT_FD(dir_fd), O_RDONLY | O_NOCTTY | O_CLOEXEC);
+ else
+ fd = RET_NERRNO(openat(dir_fd, filename, O_RDONLY | O_NOCTTY | O_CLOEXEC));
+ if (fd < 0)
+ return fd;
+
/* Limit the number of attempts to read the number of bytes returned by fstat(). */
n_retries = 3;
return !truncated;
}
-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 = -EBADF;
-
- 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 = openat(dir_fd, filename, O_RDONLY | O_NOCTTY | O_CLOEXEC);
- if (fd < 0)
- return -errno;
-
- return read_virtual_file_fd(fd, max_size, ret_contents, ret_size);
-}
-
int read_full_stream_full(
FILE *f,
const char *filename,
return read_full_file_full(AT_FDCWD, filename, UINT64_MAX, SIZE_MAX, 0, NULL, ret_contents, ret_size);
}
-int read_virtual_file_fd(int fd, 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_fd(int fd, size_t max_size, char **ret_contents, size_t *ret_size) {
+ return read_virtual_file_at(fd, NULL, max_size, ret_contents, 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);
}