From: Paul Smith Date: Sat, 7 Sep 2019 22:27:50 +0000 (-0400) Subject: * src/config.h.W32.template [W32]: Add support for dirent.d_type X-Git-Tag: 4.2.91~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=34ee9adaed8e5dc094456a901386aee24ee114f3;p=thirdparty%2Fmake.git * src/config.h.W32.template [W32]: Add support for dirent.d_type * src/w32/include/dirent.h: Add DT_* values for dirent.d_type (struct dirent): Add d_type * src/w32/compat/durent.c (readdir): Set dirent.d_type based on Windows file attributes. --- 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]; -}; - -typedef struct dir_struct { - ULONG dir_ulCookie; - HANDLE dir_hDirHandle; - DWORD dir_nNumFiles; - char dir_pDirectoryName[NAME_MAX+1]; - struct dirent dir_sdReturn; -} DIR; + { + 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; DIR *opendir(const char *); struct dirent *readdir(DIR *);