Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <dirent.h>
00027 #include <stdlib.h>
00028 #include <string.h>
00029 #include <errno.h>
00030
00031 int
00032 scandir(dir, namelist, select, cmp)
00033 const char *dir;
00034 struct dirent ***namelist;
00035 int (*select) (const struct dirent *);
00036 int (*cmp) (const void *, const void *);
00037 {
00038 DIR *dp = opendir (dir);
00039 struct dirent **v = NULL;
00040 size_t vsize = 0, i;
00041 struct dirent *d;
00042 int save;
00043
00044 if (dp == NULL)
00045 return -1;
00046
00047 save = errno;
00048 errno = 0;
00049
00050 i = 0;
00051 while ((d = readdir (dp)) != NULL)
00052 if (select == NULL || (*select) (d))
00053 {
00054 struct dirent *vnew;
00055 size_t dsize;
00056
00057
00058 errno = 0;
00059
00060 if (i == vsize)
00061 {
00062 struct dirent **new;
00063 if (vsize == 0)
00064 vsize = 10;
00065 else
00066 vsize *= 2;
00067 new = (struct dirent **) realloc (v, vsize * sizeof (*v));
00068 if (new == NULL)
00069 break;
00070 v = new;
00071 }
00072
00073 dsize = &d->d_name[strlen(d->d_name)+1] - (char *) d;
00074 vnew = (struct dirent *) malloc (dsize);
00075 if (vnew == NULL)
00076 break;
00077
00078 v[i++] = (struct dirent *) memcpy (vnew, d, dsize);
00079 }
00080
00081 if (errno != 0)
00082 {
00083 save = errno;
00084 (void) closedir (dp);
00085 while (i > 0)
00086 free (v[--i]);
00087 free (v);
00088 errno = save;
00089 return -1;
00090 }
00091
00092 (void) closedir (dp);
00093 errno = save;
00094
00095
00096 if (cmp != NULL)
00097 qsort (v, i, sizeof (*v), cmp);
00098 *namelist = v;
00099 return i;
00100 }