diff --git a/src/config.h.W32.template b/src/config.h.W32.template index d69e6b73..534f8c36 100644 --- a/src/config.h.W32.template +++ b/src/config.h.W32.template @@ -291,6 +291,9 @@ this program. If not, see . */ /* Define to 1 if you have the 'strsignal' function. */ /* #undef HAVE_STRSIGNAL */ +/* Define to 1 if `d_type' is a member of `struct dirent'. */ +#define HAVE_STRUCT_DIRENT_D_TYPE 1 + /* Define to 1 if you have the `isatty' function. */ #define HAVE_ISATTY 1 diff --git a/src/w32/compat/dirent.c b/src/w32/compat/dirent.c index dcfecbaf..6236ce57 100644 --- a/src/w32/compat/dirent.c +++ b/src/w32/compat/dirent.c @@ -135,6 +135,13 @@ readdir(DIR* pDir) pDir->dir_sdReturn.d_ino = (ino_t)-1; strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName); + if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) + pDir->dir_sdReturn.d_type = DT_CHR; + else if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + pDir->dir_sdReturn.d_type = DT_DIR; + else + pDir->dir_sdReturn.d_type = DT_REG; + return &pDir->dir_sdReturn; } diff --git a/src/w32/include/dirent.h b/src/w32/include/dirent.h index c321fd2a..a431a200 100644 --- a/src/w32/include/dirent.h +++ b/src/w32/include/dirent.h @@ -33,20 +33,46 @@ this program. If not, see . */ #define __DIRENT_COOKIE 0xfefeabab +/* File types for `d_type'. + Windows only supports DT_CHR, DT_DIR, and DT_REG. */ +enum + { + DT_UNKNOWN = 0, +# define DT_UNKNOWN DT_UNKNOWN + DT_FIFO = 1, +# define DT_FIFO DT_FIFO + DT_CHR = 2, +# define DT_CHR DT_CHR + DT_DIR = 4, +# define DT_DIR DT_DIR + DT_BLK = 6, +# define DT_BLK DT_BLK + DT_REG = 8, +# define DT_REG DT_REG + DT_LNK = 10, +# define DT_LNK DT_LNK + DT_SOCK = 12, +# define DT_SOCK DT_SOCK + DT_WHT = 14 +# define DT_WHT DT_WHT + }; + struct dirent -{ - ino_t d_ino; /* unused - no equivalent on WINDOWS32 */ - char d_name[NAME_MAX+1]; -}; + { + ino_t d_ino; /* unused - no equivalent on WINDOWS32. */ + unsigned char d_type; + char d_name[NAME_MAX+1]; /* must come last due to dir.c assumptions. */ + }; -typedef struct dir_struct { - ULONG dir_ulCookie; - HANDLE dir_hDirHandle; - DWORD dir_nNumFiles; - char dir_pDirectoryName[NAME_MAX+1]; - struct dirent dir_sdReturn; -} DIR; +typedef struct dir_struct + { + ULONG dir_ulCookie; + HANDLE dir_hDirHandle; + DWORD dir_nNumFiles; + char dir_pDirectoryName[NAME_MAX+1]; + struct dirent dir_sdReturn; + } DIR; DIR *opendir(const char *); struct dirent *readdir(DIR *);