diff options
Diffstat (limited to 'libc/misc/dirent/scandir64.c')
-rw-r--r-- | libc/misc/dirent/scandir64.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/libc/misc/dirent/scandir64.c b/libc/misc/dirent/scandir64.c new file mode 100644 index 000000000..6b0892191 --- /dev/null +++ b/libc/misc/dirent/scandir64.c @@ -0,0 +1,88 @@ +/* -*- 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 <features.h> +#define _FILE_OFFSET_BITS 64 +#define __USE_LARGEFILE64 +#define __USE_FILE_OFFSET64 +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> +#include "dirstream.h" + +#ifdef __UCLIBC_HAVE_LFS__ + +/* + * FIXME: This is a simple hack version which doesn't sort the data, and + * just passes all unsorted. + */ + +int scandir64(const char *dir, struct dirent64 ***namelist, + int (*selector) (const struct dirent64 *), + int (*compar) (const __ptr_t, const __ptr_t)) +{ + DIR *d = opendir(dir); + struct dirent64 *current; + struct dirent64 **names; + int count = 0; + int pos = 0; + int result = -1; + + if (NULL == d) + return -1; + + while (NULL != readdir64(d)) + count++; + + names = malloc(sizeof (struct dirent64 *) * count); + + rewinddir(d); + + while (NULL != (current = readdir64(d))) { + if (NULL == selector || selector(current)) { + struct dirent64 *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 dirent64 *) * pos); + + if (compar != NULL) { + qsort(names, pos, sizeof (struct dirent64 *), compar); + } + + *namelist = names; + + return pos; +} +#endif /* __UCLIBC_HAVE_LFS__ */ + |