00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef HAVE_SCANDIR
00013
00014 #include <sys/types.h>
00015 #include <dirent.h>
00016 #include <stdlib.h>
00017 #include <stddef.h>
00018 #include <string.h>
00019
00020
00021
00022
00023
00024 int
00025 __alphasort(const void *_a, const void *_b)
00026 {
00027 struct dirent **a = (struct dirent **)_a;
00028 struct dirent **b = (struct dirent **)_b;
00029 return strcmp((*a)->d_name, (*b)->d_name);
00030 }
00031
00032
00033 #define strverscmp(a,b) strcmp(a,b)
00034
00035
00036
00037
00038
00039 int
00040 __versionsort(const void *_a, const void *_b)
00041 {
00042 struct dirent **a = (struct dirent **)_a;
00043 struct dirent **b = (struct dirent **)_b;
00044 return strverscmp((*a)->d_name, (*b)->d_name);
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 int
00065 __scandir(const char *dirname,
00066 struct dirent ***ret_namelist,
00067 int (*select)(const struct dirent *),
00068 int (*compar)(const struct dirent **, const struct dirent **))
00069 {
00070 int i, len;
00071 int used, allocated;
00072 DIR *dir;
00073 struct dirent *ent, *ent2;
00074 struct dirent **namelist = NULL;
00075
00076 if ((dir = opendir(dirname)) == NULL)
00077 return -1;
00078
00079 used = 0;
00080 allocated = 2;
00081 namelist = malloc(allocated * sizeof(struct dirent *));
00082 if (!namelist)
00083 goto error;
00084
00085 while ((ent = readdir(dir)) != NULL) {
00086
00087 if (select != NULL && !select(ent))
00088 continue;
00089
00090
00091 len = offsetof(struct dirent, d_name) + strlen(ent->d_name) + 1;
00092 if ((ent2 = malloc(len)) == NULL)
00093 return -1;
00094
00095 if (used >= allocated) {
00096 allocated *= 2;
00097 namelist = realloc(namelist, allocated * sizeof(struct dirent *));
00098 if (!namelist)
00099 goto error;
00100 }
00101 memcpy(ent2, ent, len);
00102 namelist[used++] = ent2;
00103 }
00104 closedir(dir);
00105
00106 if (compar)
00107 qsort(namelist, used, sizeof(struct dirent *),
00108 (int (*)(const void *, const void *)) compar);
00109
00110 *ret_namelist = namelist;
00111 return used;
00112
00113
00114 error:
00115 if (namelist) {
00116 for (i = 0; i < used; i++)
00117 free(namelist[i]);
00118 free(namelist);
00119 }
00120 return -1;
00121 }
00122 #endif
00123
00124
00125 #if STANDALONE_MAIN
00126 int
00127 main(int argc, char **argv)
00128 {
00129 struct dirent **namelist;
00130 int i, n;
00131
00132 n = scandir("/etc", &namelist, NULL, alphasort);
00133
00134 for (i = 0; i < n; i++)
00135 printf("%s\n", namelist[i]->d_name);
00136 }
00137 #endif