MinGW readdir reimplementation to support d_type
[gitweb.git] / compat / mingw.h
index 4c50f5b1bca1e161b7e6cf0635b57f5e8d741c13..4f7ba4c13f9d0086acf9d1cfadf6912b1d641033 100644 (file)
@@ -235,3 +235,32 @@ int main(int argc, const char **argv) \
        return mingw_main(argc, argv); \
 } \
 static int mingw_main(c,v)
+
+#ifndef NO_MINGW_REPLACE_READDIR
+/*
+ * A replacement of readdir, to ensure that it reads the file type at
+ * the same time. This avoid extra unneeded lstats in git on MinGW
+ */
+#undef DT_UNKNOWN
+#undef DT_DIR
+#undef DT_REG
+#undef DT_LNK
+#define DT_UNKNOWN     0
+#define DT_DIR         1
+#define DT_REG         2
+#define DT_LNK         3
+
+struct mingw_dirent
+{
+       long            d_ino;                  /* Always zero. */
+       union {
+               unsigned short  d_reclen;       /* Always zero. */
+               unsigned char   d_type;         /* Reimplementation adds this */
+       };
+       unsigned short  d_namlen;               /* Length of name in d_name. */
+       char            d_name[FILENAME_MAX];   /* File name. */
+};
+#define dirent mingw_dirent
+#define readdir(x) mingw_readdir(x)
+struct dirent *mingw_readdir(DIR *dir);
+#endif // !NO_MINGW_REPLACE_READDIR