Reimplement scandir(3).
The old scandir implementation didn't take into account the varying
size of directory entries, and didn't correctly clean up on its
error exits.
Bug: 7339844
Change-Id: Ib40e3564709752241a3119a496cbb2192e3f9abe
diff --git a/libc/bionic/dirent.cpp b/libc/bionic/dirent.cpp
index 74297d8..0565698 100644
--- a/libc/bionic/dirent.cpp
+++ b/libc/bionic/dirent.cpp
@@ -27,11 +27,9 @@
*/
#include <dirent.h>
+
#include <errno.h>
#include <fcntl.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
@@ -146,51 +144,6 @@
d->available_bytes_ = 0;
}
-int scandir(const char* path, dirent*** namelist,
- int(*filter)(const dirent*),
- int(*compar)(const dirent**, const dirent**))
-{
- int n_elem = 0;
- dirent* this_de, *de;
- dirent** de_list = NULL;
- int de_list_size = 0;
-
- DIR* d = opendir(path);
- if (d == NULL) {
- return -1;
- }
-
- while ((this_de = readdir(d)) != NULL) {
- if (filter != NULL && (*filter)(this_de) == 0) {
- continue;
- }
- if (n_elem == 0) {
- de_list_size = 4;
- de_list = (dirent**) malloc(sizeof(dirent*) * de_list_size);
- if (de_list == NULL) {
- return -1;
- }
- } else if (n_elem == de_list_size) {
- de_list_size += 10;
- dirent** de_list_new = (dirent**) realloc(de_list, sizeof(dirent*) * de_list_size);
- if (de_list_new == NULL) {
- free(de_list);
- return -1;
- }
- de_list = de_list_new;
- }
- de = (dirent*) malloc(sizeof(dirent));
- *de = *this_de;
- de_list[n_elem++] = de;
- }
- closedir(d);
- if (n_elem && compar) {
- qsort(de_list, n_elem, sizeof(dirent*), (int (*)(const void*, const void*)) compar);
- }
- *namelist = de_list;
- return n_elem;
-}
-
-int alphasort(const struct dirent** a, const struct dirent** b) {
+int alphasort(const dirent** a, const dirent** b) {
return strcoll((*a)->d_name, (*b)->d_name);
}