summaryrefslogtreecommitdiff
path: root/src/basic/recurse-dir.h
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-10-08 10:48:52 +0200
committerLennart Poettering <lennart@poettering.net>2021-10-11 14:31:34 +0200
commit6393b847f459dba14d2b615ee93babb143168b57 (patch)
treef40afeb23cb5f91a683175366e23363d36f9d45b /src/basic/recurse-dir.h
parent25d7a71774170fd39cf08abd74a9a5a40b393f2b (diff)
downloadsystemd-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.h13
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);