17 #ifndef WIN32_LEAN_AND_MEAN
18 # define WIN32_LEAN_AND_MEAN
28 #include <sys/types.h>
33 #define _DIRENT_HAVE_D_TYPE
36 #define _DIRENT_HAVE_D_NAMLEN
39 #if !defined(FILE_ATTRIBUTE_DEVICE)
40 # define FILE_ATTRIBUTE_DEVICE 0x40
45 # define S_IFMT _S_IFMT
50 # define S_IFDIR _S_IFDIR
55 # define S_IFCHR _S_IFCHR
59 #if !defined(S_IFFIFO)
60 # define S_IFFIFO _S_IFFIFO
65 # define S_IFREG _S_IFREG
70 # define S_IREAD _S_IREAD
74 #if !defined(S_IWRITE)
75 # define S_IWRITE _S_IWRITE
80 # define S_IEXEC _S_IEXEC
85 # define S_IFIFO _S_IFIFO
99 #if !defined(S_IFSOCK)
104 #if !defined(S_IRUSR)
105 # define S_IRUSR S_IREAD
109 #if !defined(S_IWUSR)
110 # define S_IWUSR S_IWRITE
114 #if !defined(S_IXUSR)
119 #if !defined(S_IRGRP)
124 #if !defined(S_IWGRP)
129 #if !defined(S_IXGRP)
134 #if !defined(S_IROTH)
139 #if !defined(S_IWOTH)
144 #if !defined(S_IXOTH)
149 #if !defined(PATH_MAX)
150 # define PATH_MAX MAX_PATH
152 #if !defined(FILENAME_MAX)
153 # define FILENAME_MAX MAX_PATH
155 #if !defined(NAME_MAX)
156 # define NAME_MAX FILENAME_MAX
161 #define DT_REG S_IFREG
162 #define DT_DIR S_IFDIR
163 #define DT_FIFO S_IFIFO
164 #define DT_SOCK S_IFSOCK
165 #define DT_CHR S_IFCHR
166 #define DT_BLK S_IFBLK
167 #define DT_LNK S_IFLNK
170 #define IFTODT(mode) ((mode) & S_IFMT)
171 #define DTTOIF(type) (type)
179 #if !defined(S_ISFIFO)
180 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
182 #if !defined(S_ISDIR)
183 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
185 #if !defined(S_ISREG)
186 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
188 #if !defined(S_ISLNK)
189 # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
191 #if !defined(S_ISSOCK)
192 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
194 #if !defined(S_ISCHR)
195 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
197 #if !defined(S_ISBLK)
198 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
202 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen)
205 #define _D_ALLOC_NAMLEN(p) (PATH_MAX)
219 unsigned short d_reclen;
228 wchar_t d_name[PATH_MAX];
230 typedef struct _wdirent _wdirent;
237 WIN32_FIND_DATAW data;
248 typedef struct _WDIR _WDIR;
250 static _WDIR *_wopendir (
const wchar_t *dirname);
251 static struct _wdirent *_wreaddir (_WDIR *dirp);
252 static int _wclosedir (_WDIR *dirp);
253 static void _wrewinddir (_WDIR* dirp);
257 #define wdirent _wdirent
259 #define wopendir _wopendir
260 #define wreaddir _wreaddir
261 #define wclosedir _wclosedir
262 #define wrewinddir _wrewinddir
271 unsigned short d_reclen;
280 char d_name[PATH_MAX];
282 typedef struct dirent dirent;
288 typedef struct DIR DIR;
290 static DIR *opendir (
const char *dirname);
291 static struct dirent *readdir (DIR *dirp);
292 static int closedir (DIR *dirp);
293 static void rewinddir (DIR* dirp);
297 static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);
298 static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);
300 static int dirent_mbstowcs_s(
301 size_t *pReturnValue,
307 static int dirent_wcstombs_s(
308 size_t *pReturnValue,
311 const wchar_t *wcstr,
314 static void dirent_set_errno (
int error);
323 const wchar_t *dirname)
329 if (dirname == NULL || dirname[0] ==
'\0') {
330 dirent_set_errno (ENOENT);
335 dirp = (_WDIR*) malloc (
sizeof (
struct _WDIR));
340 dirp->handle = INVALID_HANDLE_VALUE;
349 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
352 n = GetFullPathNameW (dirname, 0, NULL, NULL);
356 dirp->patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
367 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
368 wcsncpy_s(dirp->patt, n+1, dirname, n);
370 n = GetFullPathNameW (dirname, n, dirp->patt, NULL);
377 if (dirp->patt < p) {
395 if (dirent_first (dirp)) {
401 dirent_set_errno (ENOENT);
406 dirent_set_errno (ENOENT);
435 static struct _wdirent*
439 WIN32_FIND_DATAW *datap;
440 struct _wdirent *entp;
443 datap = dirent_next (dirp);
457 while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) {
458 entp->d_name[n] = datap->cFileName[n];
461 dirp->ent.d_name[n] = 0;
467 attr = datap->dwFileAttributes;
468 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
469 entp->d_type = DT_CHR;
470 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
471 entp->d_type = DT_DIR;
473 entp->d_type = DT_REG;
478 entp->d_reclen =
sizeof (
struct _wdirent);
503 if (dirp->handle != INVALID_HANDLE_VALUE) {
504 FindClose (dirp->handle);
505 dirp->handle = INVALID_HANDLE_VALUE;
520 dirent_set_errno (EBADF);
536 if (dirp->handle != INVALID_HANDLE_VALUE) {
537 FindClose (dirp->handle);
546 static WIN32_FIND_DATAW*
550 WIN32_FIND_DATAW *datap;
553 dirp->handle = FindFirstFileExW(
554 dirp->patt, FindExInfoStandard, &dirp->data,
555 FindExSearchNameMatch, NULL, 0);
556 if (dirp->handle != INVALID_HANDLE_VALUE) {
573 static WIN32_FIND_DATAW*
580 if (dirp->cached != 0) {
586 }
else if (dirp->handle != INVALID_HANDLE_VALUE) {
589 if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) {
594 FindClose (dirp->handle);
595 dirp->handle = INVALID_HANDLE_VALUE;
620 if (dirname == NULL || dirname[0] ==
'\0') {
621 dirent_set_errno (ENOENT);
626 dirp = (DIR*) malloc (
sizeof (
struct DIR));
628 wchar_t wname[PATH_MAX];
632 error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX);
636 dirp->wdirp = _wopendir (wname);
682 static struct dirent*
686 WIN32_FIND_DATAW *datap;
690 datap = dirent_next (dirp->wdirp);
696 error = dirent_wcstombs_s(
697 &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX);
709 if (error && datap->cAlternateFileName[0] !=
'\0') {
710 error = dirent_wcstombs_s(
711 &n, dirp->ent.d_name, PATH_MAX,
712 datap->cAlternateFileName, PATH_MAX);
722 entp->d_namlen = n - 1;
725 attr = datap->dwFileAttributes;
726 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
727 entp->d_type = DT_CHR;
728 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
729 entp->d_type = DT_DIR;
731 entp->d_type = DT_REG;
736 entp->d_reclen =
sizeof (
struct dirent);
746 entp->d_name[0] =
'?';
747 entp->d_name[1] =
'\0';
749 entp->d_type = DT_UNKNOWN;
773 ok = _wclosedir (dirp->wdirp);
782 dirent_set_errno (EBADF);
797 _wrewinddir (dirp->wdirp);
803 size_t *pReturnValue,
811 #if defined(_MSC_VER) && _MSC_VER >= 1400
814 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
822 n = mbstowcs (wcstr, mbstr, sizeInWords);
823 if (!wcstr || n < count) {
826 if (wcstr && sizeInWords) {
827 if (n >= sizeInWords) {
835 *pReturnValue = n + 1;
856 size_t *pReturnValue,
859 const wchar_t *wcstr,
864 #if defined(_MSC_VER) && _MSC_VER >= 1400
867 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
875 n = wcstombs (mbstr, wcstr, sizeInBytes);
876 if (!mbstr || n < count) {
879 if (mbstr && sizeInBytes) {
880 if (n >= sizeInBytes) {
888 *pReturnValue = n + 1;
911 #if defined(_MSC_VER) && _MSC_VER >= 1400