35 #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86) 38 #if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_AMD64) 50 #include <sys/types.h> 55 #define _DIRENT_HAVE_D_TYPE 58 #define _DIRENT_HAVE_D_NAMLEN 61 #if !defined(FILE_ATTRIBUTE_DEVICE) 62 # define FILE_ATTRIBUTE_DEVICE 0x40 67 # define S_IFMT _S_IFMT 70 # define S_IFDIR _S_IFDIR 73 # define S_IFCHR _S_IFCHR 75 #if !defined(S_IFFIFO) 76 # define S_IFFIFO _S_IFFIFO 79 # define S_IFREG _S_IFREG 82 # define S_IREAD _S_IREAD 84 #if !defined(S_IWRITE) 85 # define S_IWRITE _S_IWRITE 88 # define S_IEXEC _S_IEXEC 91 # define S_IFIFO _S_IFIFO 99 #if !defined(S_IFSOCK) 103 #if defined(_MSC_VER) 104 # define S_IRUSR S_IREAD 105 # define S_IWUSR S_IWRITE 116 #if !defined(PATH_MAX) 117 # define PATH_MAX MAX_PATH 119 #if !defined(FILENAME_MAX) 120 # define FILENAME_MAX MAX_PATH 122 #if !defined(NAME_MAX) 123 # define NAME_MAX FILENAME_MAX 128 #define DT_REG S_IFREG 129 #define DT_DIR S_IFDIR 130 #define DT_FIFO S_IFIFO 131 #define DT_SOCK S_IFSOCK 132 #define DT_CHR S_IFCHR 133 #define DT_BLK S_IFBLK 134 #define DT_LNK S_IFLNK 137 #define IFTODT(mode) ((mode) & S_IFMT) 138 #define DTTOIF(type) (type) 146 #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 147 #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 148 #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 149 #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 150 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 151 #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 152 #define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 155 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) 158 #define _D_ALLOC_NAMLEN(p) (PATH_MAX) 169 unsigned short d_reclen;
172 wchar_t d_name[PATH_MAX];
178 WIN32_FIND_DATAW data;
183 typedef struct _WDIR _WDIR;
185 static _WDIR *_wopendir (
const wchar_t *dirname);
186 static struct _wdirent *_wreaddir (_WDIR *dirp);
187 static int _wclosedir (_WDIR *dirp);
188 static void _wrewinddir (_WDIR* dirp);
192 #define wdirent _wdirent 194 #define wopendir _wopendir 195 #define wreaddir _wreaddir 196 #define wclosedir _wclosedir 197 #define wrewinddir _wrewinddir 203 unsigned short d_reclen;
206 char d_name[PATH_MAX];
208 typedef struct dirent dirent;
214 typedef struct DIR DIR;
216 static DIR *opendir (
const char *dirname);
217 static struct dirent *readdir (DIR *dirp);
218 static int closedir (DIR *dirp);
219 static void rewinddir (DIR* dirp);
223 static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);
224 static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);
226 static int dirent_mbstowcs_s(
227 size_t *pReturnValue,
233 static int dirent_wcstombs_s(
234 size_t *pReturnValue,
237 const wchar_t *wcstr,
240 static void dirent_set_errno (
int error);
249 const wchar_t *dirname)
255 if (dirname == NULL || dirname[0] ==
'\0') {
256 dirent_set_errno (ENOENT);
261 dirp = (_WDIR*) malloc (
sizeof (
struct _WDIR));
266 dirp->handle = INVALID_HANDLE_VALUE;
271 n = GetFullPathNameW (dirname, 0, NULL, NULL);
274 dirp->patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
282 n = GetFullPathNameW (dirname, n, dirp->patt, NULL);
288 if (dirp->patt < p) {
306 if (dirent_first (dirp)) {
312 dirent_set_errno (ENOENT);
317 dirent_set_errno (ENOENT);
346 static struct _wdirent*
350 WIN32_FIND_DATAW *datap;
351 struct _wdirent *entp;
354 datap = dirent_next (dirp);
368 while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) {
369 entp->d_name[n] = datap->cFileName[n];
372 dirp->ent.d_name[n] = 0;
378 attr = datap->dwFileAttributes;
379 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
380 entp->d_type = DT_CHR;
381 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
382 entp->d_type = DT_DIR;
384 entp->d_type = DT_REG;
389 entp->d_reclen =
sizeof (
struct _wdirent);
414 if (dirp->handle != INVALID_HANDLE_VALUE) {
415 FindClose (dirp->handle);
416 dirp->handle = INVALID_HANDLE_VALUE;
431 dirent_set_errno (EBADF);
447 if (dirp->handle != INVALID_HANDLE_VALUE) {
448 FindClose (dirp->handle);
457 static WIN32_FIND_DATAW*
461 WIN32_FIND_DATAW *datap;
464 dirp->handle = FindFirstFileW (dirp->patt, &dirp->data);
465 if (dirp->handle != INVALID_HANDLE_VALUE) {
482 static WIN32_FIND_DATAW*
489 if (dirp->cached != 0) {
495 }
else if (dirp->handle != INVALID_HANDLE_VALUE) {
498 if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) {
503 FindClose (dirp->handle);
504 dirp->handle = INVALID_HANDLE_VALUE;
529 if (dirname == NULL || dirname[0] ==
'\0') {
530 dirent_set_errno (ENOENT);
535 dirp = (DIR*) malloc (
sizeof (
struct DIR));
537 wchar_t wname[PATH_MAX];
541 error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX);
545 dirp->wdirp = _wopendir (wname);
591 static struct dirent*
595 WIN32_FIND_DATAW *datap;
599 datap = dirent_next (dirp->wdirp);
605 error = dirent_wcstombs_s(
606 &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX);
618 if (error && datap->cAlternateFileName[0] !=
'\0') {
619 error = dirent_wcstombs_s(
620 &n, dirp->ent.d_name, PATH_MAX,
621 datap->cAlternateFileName, PATH_MAX);
631 entp->d_namlen = n - 1;
634 attr = datap->dwFileAttributes;
635 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
636 entp->d_type = DT_CHR;
637 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
638 entp->d_type = DT_DIR;
640 entp->d_type = DT_REG;
645 entp->d_reclen =
sizeof (
struct dirent);
655 entp->d_name[0] =
'?';
656 entp->d_name[1] =
'\0';
658 entp->d_type = DT_UNKNOWN;
682 ok = _wclosedir (dirp->wdirp);
691 dirent_set_errno (EBADF);
706 _wrewinddir (dirp->wdirp);
712 size_t *pReturnValue,
720 #if defined(_MSC_VER) && _MSC_VER >= 1400 723 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
731 n = mbstowcs (wcstr, mbstr, sizeInWords);
732 if (!wcstr || n < count) {
735 if (wcstr && sizeInWords) {
736 if (n >= sizeInWords) {
744 *pReturnValue = n + 1;
765 size_t *pReturnValue,
768 const wchar_t *wcstr,
773 #if defined(_MSC_VER) && _MSC_VER >= 1400 776 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
784 n = wcstombs (mbstr, wcstr, sizeInBytes);
785 if (!mbstr || n < count) {
788 if (mbstr && sizeInBytes) {
789 if (n >= sizeInBytes) {
797 *pReturnValue = n + 1;
820 #if defined(_MSC_VER) && _MSC_VER >= 1400 Definition: direntVS.h:210
Definition: direntVS.h:201
Definition: direntVS.h:167
Definition: direntVS.h:176