]> git.ipfire.org Git - thirdparty/make.git/commitdiff
* src/config.h.W32.template [W32]: Add support for dirent.d_type
authorPaul Smith <psmith@gnu.org>
Sat, 7 Sep 2019 22:27:50 +0000 (18:27 -0400)
committerPaul Smith <psmith@gnu.org>
Sun, 8 Sep 2019 00:12:44 +0000 (20:12 -0400)
* 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.

src/config.h.W32.template
src/w32/compat/dirent.c
src/w32/include/dirent.h

index d69e6b73695b9a2c7f02ac2dc6f119149773bb8b..534f8c363dc51f1f209bcab632c3484d3648b8d8 100644 (file)
@@ -291,6 +291,9 @@ this program.  If not, see <http://www.gnu.org/licenses/>.  */
 /* 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
 
index dcfecbaf957f11d15ecf3ccce0d46a2e13ee7129..6236ce579f3c4410859d40b5d162eba3489430ae 100644 (file)
@@ -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;
 }
 
index c321fd2ae02749958163e3ca0f0c953d54a22790..a431a20006e044e3acd4f9f958d91421e5ef2e45 100644 (file)
@@ -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 *);