78 #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) 89 #include <sys/types.h> 94 #define _DIRENT_HAVE_D_TYPE 97 #define _DIRENT_HAVE_D_NAMLEN 100 #if !defined(FILE_ATTRIBUTE_DEVICE) 101 # define FILE_ATTRIBUTE_DEVICE 0x40 106 # define S_IFMT _S_IFMT 108 #if !defined(S_IFDIR) 109 # define S_IFDIR _S_IFDIR 111 #if !defined(S_IFCHR) 112 # define S_IFCHR _S_IFCHR 114 #if !defined(S_IFFIFO) 115 # define S_IFFIFO _S_IFFIFO 117 #if !defined(S_IFREG) 118 # define S_IFREG _S_IFREG 120 #if !defined(S_IREAD) 121 # define S_IREAD _S_IREAD 123 #if !defined(S_IWRITE) 124 # define S_IWRITE _S_IWRITE 126 #if !defined(S_IEXEC) 127 # define S_IEXEC _S_IEXEC 129 #if !defined(S_IFIFO) 130 # define S_IFIFO _S_IFIFO 132 #if !defined(S_IFBLK) 135 #if !defined(S_IFLNK) 138 #if !defined(S_IFSOCK) 142 #if defined(_MSC_VER) 143 # define S_IRUSR S_IREAD 144 # define S_IWUSR S_IWRITE 155 #if !defined(PATH_MAX) 156 # define PATH_MAX MAX_PATH 158 #if !defined(FILENAME_MAX) 159 # define FILENAME_MAX MAX_PATH 161 #if !defined(NAME_MAX) 162 # define NAME_MAX FILENAME_MAX 167 #define DT_REG S_IFREG 168 #define DT_DIR S_IFDIR 169 #define DT_FIFO S_IFIFO 170 #define DT_SOCK S_IFSOCK 171 #define DT_CHR S_IFCHR 172 #define DT_BLK S_IFBLK 175 #define IFTODT(mode) ((mode) & S_IFMT) 176 #define DTTOIF(type) (type) 184 #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 185 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 186 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 187 #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 188 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 189 #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 190 #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 193 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) 196 #define _D_ALLOC_NAMLEN(p) (PATH_MAX + 1) 207 unsigned short d_reclen;
210 wchar_t d_name[PATH_MAX + 1];
216 WIN32_FIND_DATAW data;
221 typedef struct _WDIR _WDIR;
223 static _WDIR *_wopendir (
const wchar_t *dirname);
224 static struct _wdirent *_wreaddir (_WDIR *dirp);
225 static int _wclosedir (_WDIR *dirp);
226 static void _wrewinddir (_WDIR* dirp);
230 #define wdirent _wdirent 232 #define wopendir _wopendir 233 #define wreaddir _wreaddir 234 #define wclosedir _wclosedir 235 #define wrewinddir _wrewinddir 241 unsigned short d_reclen;
244 char d_name[PATH_MAX + 1];
246 typedef struct dirent dirent;
252 typedef struct DIR DIR;
254 static DIR *opendir (
const char *dirname);
255 static struct dirent *readdir (DIR *dirp);
256 static int closedir (DIR *dirp);
257 static void rewinddir (DIR* dirp);
261 static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);
262 static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);
264 static int dirent_mbstowcs_s(
265 size_t *pReturnValue,
271 static int dirent_wcstombs_s(
272 size_t *pReturnValue,
275 const wchar_t *wcstr,
278 static void dirent_set_errno (
int error);
287 const wchar_t *dirname)
293 if (dirname == NULL || dirname[0] ==
'\0') {
294 dirent_set_errno (ENOENT);
299 dirp = (_WDIR*) malloc (
sizeof (
struct _WDIR));
304 dirp->handle = INVALID_HANDLE_VALUE;
309 n = GetFullPathNameW (dirname, 0, NULL, NULL);
312 dirp->patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
320 n = GetFullPathNameW (dirname, n, dirp->patt, NULL);
326 if (dirp->patt < p) {
344 if (dirent_first (dirp)) {
350 dirent_set_errno (ENOENT);
355 dirent_set_errno (ENOENT);
384 static struct _wdirent*
388 WIN32_FIND_DATAW *datap;
389 struct _wdirent *entp;
392 datap = dirent_next (dirp);
406 while (n < PATH_MAX && datap->cFileName[n] != 0) {
407 entp->d_name[n] = datap->cFileName[n];
410 dirp->ent.d_name[n] = 0;
416 attr = datap->dwFileAttributes;
417 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
418 entp->d_type = DT_CHR;
419 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
420 entp->d_type = DT_DIR;
422 entp->d_type = DT_REG;
427 entp->d_reclen =
sizeof (
struct _wdirent);
452 if (dirp->handle != INVALID_HANDLE_VALUE) {
453 FindClose (dirp->handle);
454 dirp->handle = INVALID_HANDLE_VALUE;
469 dirent_set_errno (EBADF);
485 if (dirp->handle != INVALID_HANDLE_VALUE) {
486 FindClose (dirp->handle);
495 static WIN32_FIND_DATAW*
499 WIN32_FIND_DATAW *datap;
502 dirp->handle = FindFirstFileW (dirp->patt, &dirp->data);
503 if (dirp->handle != INVALID_HANDLE_VALUE) {
520 static WIN32_FIND_DATAW*
527 if (dirp->cached != 0) {
533 }
else if (dirp->handle != INVALID_HANDLE_VALUE) {
536 if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) {
541 FindClose (dirp->handle);
542 dirp->handle = INVALID_HANDLE_VALUE;
567 if (dirname == NULL || dirname[0] ==
'\0') {
568 dirent_set_errno (ENOENT);
573 dirp = (DIR*) malloc (
sizeof (
struct DIR));
575 wchar_t wname[PATH_MAX + 1];
579 error = dirent_mbstowcs_s(
580 &n, wname, PATH_MAX + 1, dirname, PATH_MAX);
584 dirp->wdirp = _wopendir (wname);
630 static struct dirent*
634 WIN32_FIND_DATAW *datap;
638 datap = dirent_next (dirp->wdirp);
644 error = dirent_wcstombs_s(
645 &n, dirp->ent.d_name, MAX_PATH + 1, datap->cFileName, MAX_PATH);
657 if (error && datap->cAlternateFileName[0] !=
'\0') {
658 error = dirent_wcstombs_s(
659 &n, dirp->ent.d_name, MAX_PATH + 1, datap->cAlternateFileName,
660 sizeof (datap->cAlternateFileName) /
661 sizeof (datap->cAlternateFileName[0]));
671 entp->d_namlen = n - 1;
674 attr = datap->dwFileAttributes;
675 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
676 entp->d_type = DT_CHR;
677 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
678 entp->d_type = DT_DIR;
680 entp->d_type = DT_REG;
685 entp->d_reclen =
sizeof (
struct dirent);
695 entp->d_name[0] =
'?';
696 entp->d_name[1] =
'\0';
698 entp->d_type = DT_UNKNOWN;
722 ok = _wclosedir (dirp->wdirp);
731 dirent_set_errno (EBADF);
746 _wrewinddir (dirp->wdirp);
752 size_t *pReturnValue,
760 #if defined(_MSC_VER) && _MSC_VER >= 1400 763 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
771 n = mbstowcs (wcstr, mbstr, count);
772 if (n < sizeInWords) {
781 *pReturnValue = n + 1;
802 size_t *pReturnValue,
805 const wchar_t *wcstr,
810 #if defined(_MSC_VER) && _MSC_VER >= 1400 813 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
821 n = wcstombs (mbstr, wcstr, count);
822 if (n < sizeInBytes) {
831 *pReturnValue = n + 1;
854 #if defined(_MSC_VER)