diff options
author | Lennart Poettering <lennart@poettering.net> | 2021-10-08 10:48:52 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2021-10-11 14:31:34 +0200 |
commit | 6393b847f459dba14d2b615ee93babb143168b57 (patch) | |
tree | f40afeb23cb5f91a683175366e23363d36f9d45b /src/basic/recurse-dir.h | |
parent | 25d7a71774170fd39cf08abd74a9a5a40b393f2b (diff) | |
download | systemd-6393b847f459dba14d2b615ee93babb143168b57.tar.gz |
recuse-dir: rework to use getdents64() instead of readdir()
Let's use the underlying Linux API directly, instead of
opendir()/readdir(). This makes it possible for us to do a single memory
allocation for all directory entries in common cases, instead of one for
each entry.
Diffstat (limited to 'src/basic/recurse-dir.h')
-rw-r--r-- | src/basic/recurse-dir.h | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/basic/recurse-dir.h b/src/basic/recurse-dir.h index 0605884fc0..93b00f0d97 100644 --- a/src/basic/recurse-dir.h +++ b/src/basic/recurse-dir.h @@ -67,9 +67,14 @@ typedef enum RecurseDirFlags { RECURSE_DIR_INODE_FD = 1 << 4, /* passes an opened inode fd (O_DIRECTORY fd in case of dirs, O_PATH otherwise) */ } RecurseDirFlags; -struct dirent** readdir_all_free(struct dirent **array); -DEFINE_TRIVIAL_CLEANUP_FUNC(struct dirent **, readdir_all_free); -int readdir_all(DIR *d, RecurseDirFlags flags, struct dirent ***ret); +typedef struct DirectoryEntries { + size_t n_entries; + struct dirent** entries; + size_t buffer_size; + uint8_t buffer[] _alignas_(struct dirent); +} DirectoryEntries; -int recurse_dir(DIR *d, const char *path, unsigned statx_mask, unsigned n_depth_max, RecurseDirFlags flags, recurse_dir_func_t func, void *userdata); +int readdir_all(int dir_fd, RecurseDirFlags flags, DirectoryEntries **ret); + +int recurse_dir(int dir_fd, const char *path, unsigned statx_mask, unsigned n_depth_max, RecurseDirFlags flags, recurse_dir_func_t func, void *userdata); int recurse_dir_at(int atfd, const char *path, unsigned statx_mask, unsigned n_depth_max, RecurseDirFlags flags, recurse_dir_func_t func, void *userdata); |