1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include "dirstream.h"
- 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);
- rewinddir(d);
- 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);
- if (compar != NULL) {
- qsort(names, pos, sizeof (struct dirent *), compar);
- }
- *namelist = names;
- return pos;
- }
|