|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 2/2] lib/vfscore: Add scandir
From: Vlad-Andrei BĂDOIU <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
We adapt the scandir implementation for musl to work
with our vfscore implementation.
Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxx>
---
lib/vfscore/exportsyms.uk | 1 +
lib/vfscore/main.c | 48 +++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/lib/vfscore/exportsyms.uk b/lib/vfscore/exportsyms.uk
index e863a544..223bb72b 100644
--- a/lib/vfscore/exportsyms.uk
+++ b/lib/vfscore/exportsyms.uk
@@ -131,3 +131,4 @@ futimens
utimes
lutimes
posix_fadvise
+scandir
diff --git a/lib/vfscore/main.c b/lib/vfscore/main.c
index 8c80ea61..846e2efd 100644
--- a/lib/vfscore/main.c
+++ b/lib/vfscore/main.c
@@ -36,6 +36,7 @@
#include <sys/stat.h>
#include <limits.h>
#include <string.h>
+#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <vfscore/prex.h>
@@ -708,6 +709,53 @@ int closedir(DIR *dir)
return 0;
}
+int scandir(const char *path, struct dirent ***res,
+ int (*sel)(const struct dirent *),
+ int (*cmp)(const struct dirent **, const struct dirent **))
+{
+ DIR *d = opendir(path);
+ struct dirent *de, **names=0, **tmp;
+ size_t cnt=0, len=0;
+ int old_errno = errno;
+
+ if (!d)
+ return -1;
+
+ while ((errno=0), (de = readdir(d))) {
+ if (sel && !sel(de))
+ continue;
+ if (cnt >= len) {
+ len = 2*len+1;
+ if (len > SIZE_MAX/sizeof(*names))
+ break;
+ tmp = realloc(names, len * sizeof(*names));
+ if (!tmp)
+ break;
+ names = tmp;
+ }
+ names[cnt] = malloc(de->d_reclen);
+ if (!names[cnt])
+ break;
+ memcpy(names[cnt++], de, de->d_reclen);
+ }
+
+ closedir(d);
+
+ if (errno) {
+ if (names)
+ while (cnt-->0)
+ free(names[cnt]);
+ free(names);
+ return -1;
+ }
+ errno = old_errno;
+
+ if (cmp)
+ qsort(names, cnt, sizeof *names, (int (*)(const void *, const
void *))cmp);
+ *res = names;
+ return cnt;
+}
+
struct dirent *readdir(DIR *dir)
{
static __thread struct dirent entry, *result;
--
2.20.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |