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);
 }