summaryrefslogtreecommitdiff
path: root/src/w32
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2019-09-07 18:27:50 -0400
committerPaul Smith <psmith@gnu.org>2019-09-07 20:12:44 -0400
commit34ee9adaed8e5dc094456a901386aee24ee114f3 (patch)
treeb1e7671bd140ee1bcac52ebed08d66ffd4cf68c3 /src/w32
parent64f5375fe008eff8fde4e2bc639e1d786035fd96 (diff)
downloadmake-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.c7
-rw-r--r--src/w32/include/dirent.h50
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 *);