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) 250 static _WDIR *_wopendir (
const wchar_t *dirname);
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 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);
439 WIN32_FIND_DATAW *datap;
443 datap = dirent_next (dirp);
457 while (n + 1 <
PATH_MAX && datap->cFileName[n] != 0) {
458 entp->
d_name[n] = datap->cFileName[n];
467 attr = datap->dwFileAttributes;
470 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
503 if (dirp->
handle != INVALID_HANDLE_VALUE) {
505 dirp->
handle = INVALID_HANDLE_VALUE;
520 dirent_set_errno (EBADF);
536 if (dirp->
handle != INVALID_HANDLE_VALUE) {
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*
586 }
else if (dirp->
handle != INVALID_HANDLE_VALUE) {
589 if (FindNextFileW (dirp->
handle, &dirp->
data) != FALSE) {
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));
636 dirp->
wdirp = _wopendir (wname);
686 WIN32_FIND_DATAW *datap;
690 datap = dirent_next (dirp->
wdirp);
696 error = dirent_wcstombs_s(
709 if (error && datap->cAlternateFileName[0] !=
'\0') {
710 error = dirent_wcstombs_s(
712 datap->cAlternateFileName,
PATH_MAX);
725 attr = datap->dwFileAttributes;
728 }
else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
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 WIN32_FIND_DATAW data
Definition: dirent.h:237
HANDLE handle
Definition: dirent.h:243
unsigned short d_reclen
Definition: dirent.h:271
#define PATH_MAX
Definition: dirent.h:150
#define DT_DIR
Definition: dirent.h:162
char d_name[PATH_MAX]
Definition: dirent.h:280
int cached
Definition: dirent.h:240
int d_type
Definition: dirent.h:277
size_t d_namlen
Definition: dirent.h:274
unsigned short d_reclen
Definition: dirent.h:219
long d_ino
Definition: dirent.h:268
#define DT_UNKNOWN
Definition: dirent.h:160
#define FILE_ATTRIBUTE_DEVICE
Definition: dirent.h:40
wchar_t * patt
Definition: dirent.h:246
long d_ino
Definition: dirent.h:216
int d_type
Definition: dirent.h:225
struct dirent ent
Definition: dirent.h:285
size_t d_namlen
Definition: dirent.h:222
#define DT_REG
Definition: dirent.h:161
struct _WDIR * wdirp
Definition: dirent.h:286
#define DT_CHR
Definition: dirent.h:165
struct _wdirent ent
Definition: dirent.h:234
wchar_t d_name[PATH_MAX]
Definition: dirent.h:228