18 #ifndef WIN32_LEAN_AND_MEAN 19 # define WIN32_LEAN_AND_MEAN 29 #include <sys/types.h> 34 #define _DIRENT_HAVE_D_TYPE 37 #define _DIRENT_HAVE_D_NAMLEN 40 #if !defined(FILE_ATTRIBUTE_DEVICE) 41 # define FILE_ATTRIBUTE_DEVICE 0x40 46 # define S_IFMT _S_IFMT 51 # define S_IFDIR _S_IFDIR 56 # define S_IFCHR _S_IFCHR 60 #if !defined(S_IFFIFO) 61 # define S_IFFIFO _S_IFFIFO 66 # define S_IFREG _S_IFREG 71 # define S_IREAD _S_IREAD 75 #if !defined(S_IWRITE) 76 # define S_IWRITE _S_IWRITE 81 # define S_IEXEC _S_IEXEC 86 # define S_IFIFO _S_IFIFO 100 #if !defined(S_IFSOCK) 105 #if !defined(S_IRUSR) 106 # define S_IRUSR S_IREAD 110 #if !defined(S_IWUSR) 111 # define S_IWUSR S_IWRITE 115 #if !defined(S_IXUSR) 120 #if !defined(S_IRGRP) 125 #if !defined(S_IWGRP) 130 #if !defined(S_IXGRP) 135 #if !defined(S_IROTH) 140 #if !defined(S_IWOTH) 145 #if !defined(S_IXOTH) 150 #if !defined(PATH_MAX) 151 # define PATH_MAX MAX_PATH 153 #if !defined(FILENAME_MAX) 154 # define FILENAME_MAX MAX_PATH 156 #if !defined(NAME_MAX) 157 # define NAME_MAX FILENAME_MAX 162 #define DT_REG S_IFREG 163 #define DT_DIR S_IFDIR 164 #define DT_FIFO S_IFIFO 165 #define DT_SOCK S_IFSOCK 166 #define DT_CHR S_IFCHR 167 #define DT_BLK S_IFBLK 168 #define DT_LNK S_IFLNK 171 #define IFTODT(mode) ((mode) & S_IFMT) 172 #define DTTOIF(type) (type) 180 #if !defined(S_ISFIFO) 181 # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) 183 #if !defined(S_ISDIR) 184 # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 186 #if !defined(S_ISREG) 187 # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 189 #if !defined(S_ISLNK) 190 # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) 192 #if !defined(S_ISSOCK) 193 # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) 195 #if !defined(S_ISCHR) 196 # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) 198 #if !defined(S_ISBLK) 199 # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) 203 #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) 206 #define _D_ALLOC_NAMLEN(p) (PATH_MAX) 220 unsigned short d_reclen;
229 wchar_t d_name[PATH_MAX];
231 typedef struct _wdirent _wdirent;
238 WIN32_FIND_DATAW data;
249 typedef struct _WDIR _WDIR;
251 static _WDIR *_wopendir (
const wchar_t *dirname);
252 static struct _wdirent *_wreaddir (_WDIR *dirp);
253 static int _wclosedir (_WDIR *dirp);
254 static void _wrewinddir (_WDIR* dirp);
258 #define wdirent _wdirent 260 #define wopendir _wopendir 261 #define wreaddir _wreaddir 262 #define wclosedir _wclosedir 263 #define wrewinddir _wrewinddir 272 unsigned short d_reclen;
281 char d_name[PATH_MAX];
283 typedef struct dirent dirent;
289 typedef struct DIR DIR;
291 static DIR *opendir (
const char *dirname);
292 static struct dirent *readdir (DIR *dirp);
293 static int closedir (DIR *dirp);
294 static void rewinddir (DIR* dirp);
298 static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp);
299 static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp);
301 static int dirent_mbstowcs_s(
302 size_t *pReturnValue,
308 static int dirent_wcstombs_s(
309 size_t *pReturnValue,
312 const wchar_t *wcstr,
315 static void dirent_set_errno (
int error);
324 const wchar_t *dirname)
330 if (dirname == NULL || dirname[0] ==
'\0') {
331 dirent_set_errno (ENOENT);
336 dirp = (_WDIR*) malloc (
sizeof (
struct _WDIR));
341 dirp->handle = INVALID_HANDLE_VALUE;
350 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) 353 n = GetFullPathNameW (dirname, 0, NULL, NULL);
357 dirp->patt = (
wchar_t*) malloc (
sizeof (
wchar_t) * n + 16);
368 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) 369 wcsncpy_s(dirp->patt, n+1, dirname, n);
371 n = GetFullPathNameW (dirname, n, dirp->patt, NULL);
378 if (dirp->patt < p) {
396 if (dirent_first (dirp)) {
402 dirent_set_errno (ENOENT);
407 dirent_set_errno (ENOENT);
436 static struct _wdirent*
440 WIN32_FIND_DATAW *datap;
441 struct _wdirent *entp;
444 datap = dirent_next (dirp);
458 while (n + 1 < PATH_MAX && datap->cFileName[n] != 0) {
459 entp->d_name[n] = datap->cFileName[n];
462 dirp->ent.d_name[n] = 0;
468 attr = datap->dwFileAttributes;
469 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
470 entp->d_type = DT_CHR;
471 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
472 entp->d_type = DT_DIR;
474 entp->d_type = DT_REG;
479 entp->d_reclen =
sizeof (
struct _wdirent);
504 if (dirp->handle != INVALID_HANDLE_VALUE) {
505 FindClose (dirp->handle);
506 dirp->handle = INVALID_HANDLE_VALUE;
521 dirent_set_errno (EBADF);
537 if (dirp->handle != INVALID_HANDLE_VALUE) {
538 FindClose (dirp->handle);
547 static WIN32_FIND_DATAW*
551 WIN32_FIND_DATAW *datap;
554 dirp->handle = FindFirstFileExW(
555 dirp->patt, FindExInfoStandard, &dirp->data,
556 FindExSearchNameMatch, NULL, 0);
557 if (dirp->handle != INVALID_HANDLE_VALUE) {
574 static WIN32_FIND_DATAW*
581 if (dirp->cached != 0) {
587 }
else if (dirp->handle != INVALID_HANDLE_VALUE) {
590 if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) {
595 FindClose (dirp->handle);
596 dirp->handle = INVALID_HANDLE_VALUE;
621 if (dirname == NULL || dirname[0] ==
'\0') {
622 dirent_set_errno (ENOENT);
627 dirp = (DIR*) malloc (
sizeof (
struct DIR));
629 wchar_t wname[PATH_MAX];
633 error = dirent_mbstowcs_s (&n, wname, PATH_MAX, dirname, PATH_MAX);
637 dirp->wdirp = _wopendir (wname);
683 static struct dirent*
687 WIN32_FIND_DATAW *datap;
691 datap = dirent_next (dirp->wdirp);
697 error = dirent_wcstombs_s(
698 &n, dirp->ent.d_name, PATH_MAX, datap->cFileName, PATH_MAX);
710 if (error && datap->cAlternateFileName[0] !=
'\0') {
711 error = dirent_wcstombs_s(
712 &n, dirp->ent.d_name, PATH_MAX,
713 datap->cAlternateFileName, PATH_MAX);
723 entp->d_namlen = n - 1;
726 attr = datap->dwFileAttributes;
727 if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
728 entp->d_type = DT_CHR;
729 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
730 entp->d_type = DT_DIR;
732 entp->d_type = DT_REG;
737 entp->d_reclen =
sizeof (
struct dirent);
747 entp->d_name[0] =
'?';
748 entp->d_name[1] =
'\0';
750 entp->d_type = DT_UNKNOWN;
774 ok = _wclosedir (dirp->wdirp);
783 dirent_set_errno (EBADF);
798 _wrewinddir (dirp->wdirp);
804 size_t *pReturnValue,
812 #if defined(_MSC_VER) && _MSC_VER >= 1400 815 error = mbstowcs_s (pReturnValue, wcstr, sizeInWords, mbstr, count);
823 n = mbstowcs (wcstr, mbstr, sizeInWords);
824 if (!wcstr || n < count) {
827 if (wcstr && sizeInWords) {
828 if (n >= sizeInWords) {
836 *pReturnValue = n + 1;
857 size_t *pReturnValue,
860 const wchar_t *wcstr,
865 #if defined(_MSC_VER) && _MSC_VER >= 1400 868 error = wcstombs_s (pReturnValue, mbstr, sizeInBytes, wcstr, count);
876 n = wcstombs (mbstr, wcstr, sizeInBytes);
877 if (!mbstr || n < count) {
880 if (mbstr && sizeInBytes) {
881 if (n >= sizeInBytes) {
889 *pReturnValue = n + 1;
912 #if defined(_MSC_VER) && _MSC_VER >= 1400