summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/misc/dirent/Makefile2
-rw-r--r--libc/misc/dirent/alphasort.c10
-rw-r--r--libc/misc/dirent/scandir.c79
3 files changed, 90 insertions, 1 deletions
diff --git a/libc/misc/dirent/Makefile b/libc/misc/dirent/Makefile
index e09773ead..8de2054b6 100644
--- a/libc/misc/dirent/Makefile
+++ b/libc/misc/dirent/Makefile
@@ -24,7 +24,7 @@ TOPDIR=../../
include $(TOPDIR)Rules.mak
LIBC=$(TOPDIR)libc.a
-CSRC=closedir.c dirfd.c opendir.c readdir.c rewinddir.c seekdir.c telldir.c
+CSRC=alphasort.c closedir.c dirfd.c opendir.c readdir.c rewinddir.c scandir.c seekdir.c telldir.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(COBJS)
diff --git a/libc/misc/dirent/alphasort.c b/libc/misc/dirent/alphasort.c
new file mode 100644
index 000000000..f0ff0497a
--- /dev/null
+++ b/libc/misc/dirent/alphasort.c
@@ -0,0 +1,10 @@
+#include <string.h>
+#include "dirstream.h"
+
+int alphasort(const __ptr_t __e1, const __ptr_t __e2)
+{
+ const struct dirent *a = __e1;
+ const struct dirent *b = __e2;
+ return (strcmp(a->d_name, b->d_name));
+}
+
diff --git a/libc/misc/dirent/scandir.c b/libc/misc/dirent/scandir.c
new file mode 100644
index 000000000..2b07e294c
--- /dev/null
+++ b/libc/misc/dirent/scandir.c
@@ -0,0 +1,79 @@
+/* -*- Mode: C; c-file-style: "gnu" -*- */
+/*
+ Copyright (c) 2000 Petter Reinholdtsen
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include "dirstream.h"
+
+/*
+ * FIXME: This is a simple hack version which doesn't sort the data, and
+ * just passes all unsorted.
+ */
+
+int scandir(const char *dir, struct dirent ***namelist,
+ int (*selector) (const struct dirent *),
+ int (*compar) (const __ptr_t, const __ptr_t))
+{
+ DIR *d = opendir(dir);
+ struct dirent *current;
+ struct dirent **names;
+ int count = 0;
+ int pos = 0;
+ int result = -1;
+
+ if (NULL == d)
+ return -1;
+
+ while (NULL != readdir(d))
+ count++;
+
+ names = malloc(sizeof (struct dirent *) * count);
+
+ closedir(d);
+ d = opendir(dir);
+ if (NULL == d)
+ return -1;
+
+ while (NULL != (current = readdir(d))) {
+ if (NULL == selector || selector(current)) {
+ struct dirent *copyentry = malloc(current->d_reclen);
+
+ memcpy(copyentry, current, current->d_reclen);
+
+ names[pos] = copyentry;
+ pos++;
+ }
+ }
+ result = closedir(d);
+
+ if (pos != count)
+ names = realloc(names, sizeof (struct dirent *) * pos);
+
+ *namelist = names;
+
+ return pos;
+}