13 #if defined(__clang__) 14 # pragma clang diagnostic ignored "-Wunused-function" 15 #elif defined(_MSC_VER) 16 # pragma warning(disable:4505) 17 #elif defined(__GNUC__) 18 # pragma GCC diagnostic ignored "-Wunused-function" 25 #ifndef WIN32_LEAN_AND_MEAN 26 # define WIN32_LEAN_AND_MEAN 36 #include <sys/types.h> 41 #define _DIRENT_HAVE_D_TYPE 44 #define _DIRENT_HAVE_D_NAMLEN 47 #if !defined(FILE_ATTRIBUTE_DEVICE) 48 # define FILE_ATTRIBUTE_DEVICE 0x40 53 # define S_IFMT _S_IFMT 58 # define S_IFDIR _S_IFDIR 63 # define S_IFCHR _S_IFCHR 67 #if !defined(S_IFFIFO) 68 # define S_IFFIFO _S_IFFIFO 73 # define S_IFREG _S_IFREG 78 # define S_IREAD _S_IREAD 82 #if !defined(S_IWRITE) 83 # define S_IWRITE _S_IWRITE 88 # define S_IEXEC _S_IEXEC 93 # define S_IFIFO _S_IFIFO 102 #if !defined(S_IFLNK) 107 #if !defined(S_IFSOCK) 112 #if !defined(S_IRUSR) 113 # define S_IRUSR S_IREAD 117 #if !defined(S_IWUSR) 118 # define S_IWUSR S_IWRITE 122 #if !defined(S_IXUSR) 127 #if !defined(S_IRGRP) 132 #if !defined(S_IWGRP) 137 #if !defined(S_IXGRP) 142 #if !defined(S_IROTH) 147 #if !defined(S_IWOTH) 152 #if !defined(S_IXOTH) 157 #if !defined(PATH_MAX) 158 # define PATH_MAX MAX_PATH 160 #if !defined(FILENAME_MAX) 161 # define FILENAME_MAX MAX_PATH 163 #if !defined(NAME_MAX) 164 # define NAME_MAX FILENAME_MAX 169 #define DT_REG S_IFREG 170 #define DT_DIR S_IFDIR 171 #define DT_FIFO S_IFIFO 172 #define DT_SOCK S_IFSOCK 173 #define DT_CHR S_IFCHR 174 #define DT_BLK S_IFBLK 175 #define DT_LNK S_IFLNK 178 #define IFTODT(mode) ((mode) & S_IFMT) 179 #define DTTOIF(type) (type) 187 #if !defined(S_ISFIFO) 188 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 190 #if !defined(S_ISDIR) 191 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 193 #if !defined(S_ISREG) 194 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 196 #if !defined(S_ISLNK) 197 # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 199 #if !defined(S_ISSOCK) 200 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 202 #if !defined(S_ISCHR) 203 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 205 #if !defined(S_ISBLK) 206 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 210 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) 213 #define _D_ALLOC_NAMLEN(p) ((PATH_MAX)+1) 291 static DIR *opendir (
const char *dirname);
292 static _WDIR *_wopendir (
const wchar_t *dirname);
294 static struct dirent *readdir (
DIR *dirp);
297 static int readdir_r(
299 static int _wreaddir_r(
302 static int closedir (
DIR *dirp);
303 static int _wclosedir (
_WDIR *dirp);
305 static void rewinddir (
DIR* dirp);
306 static void _wrewinddir (
_WDIR* dirp);
308 static int scandir (
const char *dirname,
struct dirent ***namelist,
309 int (*filter)(
const struct dirent*),
310 int (*compare)(
const struct dirent**,
const struct dirent**));
312 static int alphasort (
const struct dirent **a,
const struct dirent **b);
314 static int versionsort (
const struct dirent **a,
const struct dirent **b);
318 #define wdirent _wdirent 320 #define wopendir _wopendir 321 #define wreaddir _wreaddir 322 #define wclosedir _wclosedir 323 #define wrewinddir _wrewinddir 327 static WIN32_FIND_DATAW *dirent_first (
_WDIR *dirp);
328 static WIN32_FIND_DATAW *dirent_next (
_WDIR *dirp);
330 static int dirent_mbstowcs_s(
331 size_t *pReturnValue,
337 static int dirent_wcstombs_s(
338 size_t *pReturnValue,
341 const wchar_t *wcstr,
344 static void dirent_set_errno (
int error);
354 const wchar_t *dirname)
361 if (dirname == NULL || dirname[0] ==
'\0') {
362 dirent_set_errno (ENOENT);
367 dirp = (
_WDIR*) malloc (
sizeof (
struct _WDIR));
373 dirp->
handle = INVALID_HANDLE_VALUE;
383 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 385 n = GetFullPathNameW (dirname, 0, NULL, NULL);
388 n = wcslen (dirname);
392 dirp->
patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
393 if (dirp->
patt == NULL) {
405 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 407 n = GetFullPathNameW (dirname, n, dirp->
patt, NULL);
413 wcsncpy_s (dirp->
patt, n+1, dirname, n);
434 if (!dirent_first (dirp)) {
463 (void) _wreaddir_r (dirp, &dirp->
ent, &entry);
481 WIN32_FIND_DATAW *datap;
484 datap = dirent_next (dirp);
495 while (n < PATH_MAX && datap->cFileName[n] != 0) {
496 entry->
d_name[n] = datap->cFileName[n];
505 attr = datap->dwFileAttributes;
508 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
545 if (dirp->
handle != INVALID_HANDLE_VALUE) {
559 dirent_set_errno (EBADF);
576 if (dirp->
handle != INVALID_HANDLE_VALUE) {
586 static WIN32_FIND_DATAW*
590 WIN32_FIND_DATAW *datap;
594 dirp->
handle = FindFirstFileExW(
595 dirp->
patt, FindExInfoStandard, &dirp->
data,
596 FindExSearchNameMatch, NULL, 0);
597 if (dirp->
handle != INVALID_HANDLE_VALUE) {
610 error = GetLastError ();
612 case ERROR_ACCESS_DENIED:
614 dirent_set_errno (EACCES);
617 case ERROR_DIRECTORY:
619 dirent_set_errno (ENOTDIR);
622 case ERROR_PATH_NOT_FOUND:
625 dirent_set_errno (ENOENT);
637 static WIN32_FIND_DATAW*
650 }
else if (dirp->
handle != INVALID_HANDLE_VALUE) {
653 if (FindNextFileW (dirp->
handle, &dirp->
data) != FALSE) {
659 dirp->
handle = INVALID_HANDLE_VALUE;
683 if (dirname == NULL || dirname[0] ==
'\0') {
684 dirent_set_errno (ENOENT);
689 dirp = (
DIR*) malloc (
sizeof (
struct DIR));
699 error = dirent_mbstowcs_s(
713 dirp->
wdirp = _wopendir (wname);
742 (void) readdir_r (dirp, &dirp->
ent, &entry);
760 WIN32_FIND_DATAW *datap;
763 datap = dirent_next (dirp->
wdirp);
769 error = dirent_wcstombs_s(
782 if (error && datap->cAlternateFileName[0] !=
'\0') {
783 error = dirent_wcstombs_s(
785 datap->cAlternateFileName,
PATH_MAX + 1);
795 attr = datap->dwFileAttributes;
798 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
851 ok = _wclosedir (dirp->
wdirp);
860 dirent_set_errno (EBADF);
875 _wrewinddir (dirp->
wdirp);
884 struct dirent ***namelist,
885 int (*filter)(
const struct dirent*),
886 int (*compare)(
const struct dirent**,
const struct dirent**))
888 struct dirent **files = NULL;
890 size_t allocated = 0;
891 const size_t init_size = 1;
894 struct dirent *tmp = NULL;
899 dir = opendir (dirname);
906 if (size >= allocated) {
911 if (size < init_size) {
913 num_entries = init_size;
916 num_entries = size * 2;
920 p = realloc (files,
sizeof (
void*) * num_entries);
924 allocated = num_entries;
944 if (readdir_r (dir, tmp, &entry) == 0) {
974 qsort (files, size,
sizeof (
void*),
975 (
int (*) (
const void*,
const void*)) compare);
998 for (i = 0; i < size; i++) {
1022 return strcoll ((*a)->d_name, (*b)->d_name);
1031 return alphasort (a, b);
1037 size_t *pReturnValue,
1045 #if defined(_MSC_VER) && _MSC_VER >= 1400 1048 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
1056 n = mbstowcs (wcstr, mbstr, sizeInWords);
1057 if (!wcstr || n < count) {
1060 if (wcstr && sizeInWords) {
1061 if (n >= sizeInWords) {
1062 n = sizeInWords - 1;
1069 *pReturnValue = n + 1;
1089 size_t *pReturnValue,
1092 const wchar_t *wcstr,
1097 #if defined(_MSC_VER) && _MSC_VER >= 1400 1100 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
1108 n = wcstombs (mbstr, wcstr, sizeInBytes);
1109 if (!mbstr || n < count) {
1112 if (mbstr && sizeInBytes) {
1113 if (n >= sizeInBytes) {
1114 n = sizeInBytes - 1;
1121 *pReturnValue = n + 1;
1143 #if defined(_MSC_VER) && _MSC_VER >= 1400 WIN32_FIND_DATAW data
Definition: dirent.h:248
HANDLE handle
Definition: dirent.h:254
unsigned short d_reclen
Definition: dirent.h:270
#define PATH_MAX
Definition: dirent.h:158
#define DT_DIR
Definition: dirent.h:170
int cached
Definition: dirent.h:251
int d_type
Definition: dirent.h:276
size_t d_namlen
Definition: dirent.h:273
unsigned short d_reclen
Definition: dirent.h:230
long d_off
Definition: dirent.h:267
long d_ino
Definition: dirent.h:264
#define DT_UNKNOWN
Definition: dirent.h:168
char d_name[PATH_MAX+1]
Definition: dirent.h:279
#define FILE_ATTRIBUTE_DEVICE
Definition: dirent.h:48
wchar_t * patt
Definition: dirent.h:257
long d_ino
Definition: dirent.h:224
int d_type
Definition: dirent.h:236
wchar_t d_name[PATH_MAX+1]
Definition: dirent.h:239
long d_off
Definition: dirent.h:227
struct dirent ent
Definition: dirent.h:284
size_t d_namlen
Definition: dirent.h:233
#define DT_REG
Definition: dirent.h:169
struct _WDIR * wdirp
Definition: dirent.h:285
#define DT_CHR
Definition: dirent.h:173
struct _wdirent ent
Definition: dirent.h:245