diff options
author | Paul Smith <psmith@gnu.org> | 2019-09-07 18:27:50 -0400 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2019-09-07 20:12:44 -0400 |
commit | 34ee9adaed8e5dc094456a901386aee24ee114f3 (patch) | |
tree | b1e7671bd140ee1bcac52ebed08d66ffd4cf68c3 /src/w32 | |
parent | 64f5375fe008eff8fde4e2bc639e1d786035fd96 (diff) | |
download | make-git-34ee9adaed8e5dc094456a901386aee24ee114f3.tar.gz |
* 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.
Diffstat (limited to 'src/w32')
-rw-r--r-- | src/w32/compat/dirent.c | 7 | ||||
-rw-r--r-- | src/w32/include/dirent.h | 50 |
2 files changed, 45 insertions, 12 deletions
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 <http://www.gnu.org/licenses/>. */ #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 *); |