summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-10-03 14:21:12 +0200
committerAnton Kling <anton@kling.gg>2024-10-03 14:21:12 +0200
commit64b0b49a1f23da9faa680f8158cb8a12cd4d118c (patch)
treeba165c5e9d66ed9534958fcf5c9a8a36061b7433
parenta8226de3e53937b579705586a16ccc884b8efb5d (diff)
libc: Add readdir_multi
This is a faster, zero allocation function for reading directory entries. It has massive speed increases for certain applications since malloc(especially my implementation) is really slow in comparison.
-rw-r--r--include/dirent.h1
-rw-r--r--userland/libc/dirent/readdir.c13
2 files changed, 14 insertions, 0 deletions
diff --git a/include/dirent.h b/include/dirent.h
index dcd7f59..66e8e8f 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -34,5 +34,6 @@ int scandir_sane(const char *dir, struct dirent ***namelist,
int (*compar)(const struct dirent **,
const struct dirent **));
void scandir_sane_free(struct dirent **namelist);
+int readdir_multi(DIR *dir, struct dirent *entries, int num_entries);
#endif // KERNEL
#endif // DIRENT_H
diff --git a/userland/libc/dirent/readdir.c b/userland/libc/dirent/readdir.c
index 8b825cb..9a9f8fa 100644
--- a/userland/libc/dirent/readdir.c
+++ b/userland/libc/dirent/readdir.c
@@ -1,6 +1,19 @@
#include <dirent.h>
#include <unistd.h>
+int readdir_multi(DIR *dir, struct dirent *entries, int num_entries) {
+ size_t offset = dir->dir_num * sizeof(struct dirent);
+ int rc;
+ if (-1 == (rc = pread(dir->fd, entries, num_entries * sizeof(struct dirent),
+ offset))) {
+ return -1;
+ }
+
+ int num_read_entries = rc / sizeof(struct dirent);
+ dir->dir_num += num_read_entries;
+ return num_read_entries;
+}
+
struct dirent *readdir(DIR *dir) {
size_t offset = dir->dir_num * sizeof(struct dirent);
int rc;