18 #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) 21 #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64) 33 #include <sys/types.h> 38 #define _DIRENT_HAVE_D_TYPE 41 #define _DIRENT_HAVE_D_NAMLEN 44 #if !defined(FILE_ATTRIBUTE_DEVICE) 45 # define FILE_ATTRIBUTE_DEVICE 0x40 50 # define S_IFMT _S_IFMT 55 # define S_IFDIR _S_IFDIR 60 # define S_IFCHR _S_IFCHR 64 #if !defined(S_IFFIFO) 65 # define S_IFFIFO _S_IFFIFO 70 # define S_IFREG _S_IFREG 75 # define S_IREAD _S_IREAD 79 #if !defined(S_IWRITE) 80 # define S_IWRITE _S_IWRITE 85 # define S_IEXEC _S_IEXEC 90 # define S_IFIFO _S_IFIFO 104 #if !defined(S_IFSOCK) 109 #if !defined(S_IRUSR) 110 # define S_IRUSR S_IREAD 114 #if !defined(S_IWUSR) 115 # define S_IWUSR S_IWRITE 119 #if !defined(S_IXUSR) 124 #if !defined(S_IRGRP) 129 #if !defined(S_IWGRP) 134 #if !defined(S_IXGRP) 139 #if !defined(S_IROTH) 144 #if !defined(S_IWOTH) 149 #if !defined(S_IXOTH) 154 #if !defined(PATH_MAX) 155 # define PATH_MAX MAX_PATH 157 #if !defined(FILENAME_MAX) 158 # define FILENAME_MAX MAX_PATH 160 #if !defined(NAME_MAX) 161 # define NAME_MAX FILENAME_MAX 166 #define DT_REG S_IFREG 167 #define DT_DIR S_IFDIR 168 #define DT_FIFO S_IFIFO 169 #define DT_SOCK S_IFSOCK 170 #define DT_CHR S_IFCHR 171 #define DT_BLK S_IFBLK 172 #define DT_LNK S_IFLNK 175 #define IFTODT(mode) ((mode) & S_IFMT) 176 #define DTTOIF(type) (type) 184 #if !defined(S_ISFIFO) 185 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 187 #if !defined(S_ISDIR) 188 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 190 #if !defined(S_ISREG) 191 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 193 #if !defined(S_ISLNK) 194 # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 196 #if !defined(S_ISSOCK) 197 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 199 #if !defined(S_ISCHR) 200 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 202 #if !defined(S_ISBLK) 203 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 207 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) 210 #define _D_ALLOC_NAMLEN(p) (PATH_MAX) 224 unsigned short d_reclen;
233 wchar_t d_name[PATH_MAX];
242 WIN32_FIND_DATAW data;
253 typedef struct _WDIR _WDIR;
255 static _WDIR *_wopendir (
const wchar_t *dirname);
256 static struct _wdirent *_wreaddir (_WDIR *dirp);
257 static int _wclosedir (_WDIR *dirp);
258 static void _wrewinddir (_WDIR* dirp);
262 #define wdirent _wdirent 264 #define wopendir _wopendir 265 #define wreaddir _wreaddir 266 #define wclosedir _wclosedir 267 #define wrewinddir _wrewinddir 276 unsigned short d_reclen;
285 char d_name[PATH_MAX];
287 typedef struct dirent dirent;
293 typedef struct DIR DIR;
295 static DIR *opendir (
const char *dirname);
296 static struct dirent *readdir (DIR *dirp);
297 static int closedir (DIR *dirp);
298 static void rewinddir (DIR* dirp);
302 static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);
303 static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);
305 static int dirent_mbstowcs_s(
306 size_t *pReturnValue,
312 static int dirent_wcstombs_s(
313 size_t *pReturnValue,
316 const wchar_t *wcstr,
319 static void dirent_set_errno (
int error);
328 const wchar_t *dirname)
334 if (dirname == NULL || dirname[0] ==
'\0') {
335 dirent_set_errno (ENOENT);
340 dirp = (_WDIR*) malloc (
sizeof (
struct _WDIR));
345 dirp->handle = INVALID_HANDLE_VALUE;
350 n = GetFullPathNameW (dirname, 0, NULL, NULL);
353 dirp->patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
361 n = GetFullPathNameW (dirname, n, dirp->patt, NULL);
367 if (dirp->patt < p) {
385 if (dirent_first (dirp)) {
391 dirent_set_errno (ENOENT);
396 dirent_set_errno (ENOENT);
425 static struct _wdirent*
429 WIN32_FIND_DATAW *datap;
430 struct _wdirent *entp;
433 datap = dirent_next (dirp);
447 while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) {
448 entp->d_name[n] = datap->cFileName[n];
451 dirp->ent.d_name[n] = 0;
457 attr = datap->dwFileAttributes;
458 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
459 entp->d_type = DT_CHR;
460 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
461 entp->d_type = DT_DIR;
463 entp->d_type = DT_REG;
468 entp->d_reclen =
sizeof (
struct _wdirent);
493 if (dirp->handle != INVALID_HANDLE_VALUE) {
494 FindClose (dirp->handle);
495 dirp->handle = INVALID_HANDLE_VALUE;
510 dirent_set_errno (EBADF);
526 if (dirp->handle != INVALID_HANDLE_VALUE) {
527 FindClose (dirp->handle);
536 static WIN32_FIND_DATAW*
540 WIN32_FIND_DATAW *datap;
543 dirp->handle = FindFirstFileW (dirp->patt, &dirp->data);
544 if (dirp->handle != INVALID_HANDLE_VALUE) {
561 static WIN32_FIND_DATAW*
568 if (dirp->cached != 0) {
574 }
else if (dirp->handle != INVALID_HANDLE_VALUE) {
577 if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) {
582 FindClose (dirp->handle);
583 dirp->handle = INVALID_HANDLE_VALUE;
608 if (dirname == NULL || dirname[0] ==
'\0') {
609 dirent_set_errno (ENOENT);
614 dirp = (DIR*) malloc (
sizeof (
struct DIR));
616 wchar_t wname[PATH_MAX];
620 error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX);
624 dirp->wdirp = _wopendir (wname);
670 static struct dirent*
674 WIN32_FIND_DATAW *datap;
678 datap = dirent_next (dirp->wdirp);
684 error = dirent_wcstombs_s(
685 &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX);
697 if (error && datap->cAlternateFileName[0] !=
'\0') {
698 error = dirent_wcstombs_s(
699 &n, dirp->ent.d_name, PATH_MAX,
700 datap->cAlternateFileName, PATH_MAX);
710 entp->d_namlen = n - 1;
713 attr = datap->dwFileAttributes;
714 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
715 entp->d_type = DT_CHR;
716 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
717 entp->d_type = DT_DIR;
719 entp->d_type = DT_REG;
724 entp->d_reclen =
sizeof (
struct dirent);
734 entp->d_name[0] =
'?';
735 entp->d_name[1] =
'\0';
737 entp->d_type = DT_UNKNOWN;
761 ok = _wclosedir (dirp->wdirp);
770 dirent_set_errno (EBADF);
785 _wrewinddir (dirp->wdirp);
791 size_t *pReturnValue,
799 #if defined(_MSC_VER) && _MSC_VER >= 1400 802 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
810 n = mbstowcs (wcstr, mbstr, sizeInWords);
811 if (!wcstr || n < count) {
814 if (wcstr && sizeInWords) {
815 if (n >= sizeInWords) {
823 *pReturnValue = n + 1;
844 size_t *pReturnValue,
847 const wchar_t *wcstr,
852 #if defined(_MSC_VER) && _MSC_VER >= 1400 855 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
863 n = wcstombs (mbstr, wcstr, sizeInBytes);
864 if (!mbstr || n < count) {
867 if (mbstr && sizeInBytes) {
868 if (n >= sizeInBytes) {
876 *pReturnValue = n + 1;
899 #if defined(_MSC_VER) && _MSC_VER >= 1400