adopted an updated path to a test script.
[AROS.git] / compiler / posixc / scandir.c
blobd814570ca0dbed64c276a556b77bcde9405e6e6f
1 /*
2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
3 $Id$
5 POSIX.1-2008 function scandir().
6 */
8 #include <errno.h>
9 #include <stdlib.h>
10 #include <string.h>
12 /*****************************************************************************
14 NAME */
15 #include <dirent.h>
17 int scandir (
19 /* SYNOPSIS */
20 const char *dir,
21 struct dirent ***namelist,
22 int (*select)(const struct dirent *),
23 int (*compar)(const struct dirent **, const struct dirent **)
26 /* FUNCTION
27 Scan directory
29 INPUTS
30 dir - Directory to be scanned
31 namelist - Array with the found entries.
32 select - Filter function which must return non-zero if entry shall be
33 added. If NULL all entries will be added.
34 compar - Function which will be used by qsort() for sorting of the
35 entries. The function alphasort() can be used for sorting
36 in alphabetical oder. If NULL sorting order isn't specified.
38 RESULT
39 Number of entries
41 NOTES
43 EXAMPLE
45 BUGS
47 SEE ALSO
48 alphasort()
50 INTERNALS
52 ******************************************************************************/
54 DIR *dirp = NULL;
55 struct dirent *dp;
56 struct dirent *newdp;
57 int cnt = 0;
58 struct dirent **darr = NULL;
59 struct dirent **newdarr;
60 int arrcnt = 0;
61 int selected;
62 int olderrno;
64 errno = 0;
66 if ((dirp = opendir(dir)) == NULL)
68 goto fail;
73 if ((dp = readdir(dirp)) != NULL)
75 selected = 0;
76 if (select != NULL)
78 olderrno = errno;
79 selected = select(dp);
80 errno = olderrno;
82 if ((select == NULL) || selected)
84 if ((darr == NULL) || cnt >= arrcnt)
86 arrcnt += 50;
87 newdarr = realloc(darr, arrcnt * sizeof(*darr));
88 if (newdarr == NULL)
90 goto fail;
92 darr = newdarr;
94 newdp = malloc(sizeof(*newdp));
95 if (newdp == NULL)
97 goto fail;
99 memcpy(newdp, dp, sizeof(*newdp));
100 darr[cnt] = newdp;
101 cnt++;
104 } while (dp != NULL);
106 closedir(dirp);
108 if (compar != NULL)
110 olderrno = errno;
111 qsort (darr, cnt, sizeof (*darr), (int (*) (const void *, const void *)) compar);
112 errno = olderrno;
114 *namelist = darr;
115 return cnt;
117 fail:
118 while (cnt > 0)
120 free(darr[--cnt]);
122 free(darr);
123 closedir(dirp);
124 return -1;