path: root/compat/win32/dirent.h
diff options
authorErik Faye-Lund <>2010-11-23 18:38:29 (GMT)
committerJunio C Hamano <>2010-11-24 00:06:50 (GMT)
commitd1b6e6e015501272c7491b3a4adf3cd3904edefa (patch)
treeb93cb52156b48591fe6ea5d873528cc9186f8c09 /compat/win32/dirent.h
parente7772600e94146ddbf5ef6b08d0ea7d6fc8fbcad (diff)
win32: use our own dirent.h
The mingw-runtime implemenation of opendir, readdir and closedir sets errno to 0 on success, something that POSIX explicitly forbids. 3ba7a06 ("A loose object is not corrupt if it cannot be read due to EMFILE") introduce a dependency on this behaviour, leading to a broken "git clone" on Windows. compat/mingw.c contains an implementation of readdir, and compat/msvc.c contains implementations of opendir and closedir. Move these to compat/win32/dirent.[ch], and change to our own DIR structure at the same time. This provides a generic Win32-implementation of opendir, readdir and closedir which works on both MinGW and MSVC and does not reset errno, and as a result git clone is working again on Windows. Signed-off-by: Erik Faye-Lund <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'compat/win32/dirent.h')
1 files changed, 24 insertions, 0 deletions
diff --git a/compat/win32/dirent.h b/compat/win32/dirent.h
new file mode 100644
index 0000000..927a25c
--- /dev/null
+++ b/compat/win32/dirent.h
@@ -0,0 +1,24 @@
+#ifndef DIRENT_H
+#define DIRENT_H
+typedef struct DIR DIR;
+#define DT_UNKNOWN 0
+#define DT_DIR 1
+#define DT_REG 2
+#define DT_LNK 3
+struct dirent {
+ long d_ino; /* Always zero. */
+ char d_name[FILENAME_MAX]; /* File name. */
+ union {
+ unsigned short d_reclen; /* Always zero. */
+ unsigned char d_type; /* Reimplementation adds this */
+ };
+DIR *opendir(const char *dirname);
+struct dirent *readdir(DIR *dir);
+int closedir(DIR *dir);
+#endif /* DIRENT_H */