From d1b6e6e015501272c7491b3a4adf3cd3904edefa Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 23 Nov 2010 19:38:29 +0100 Subject: 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 --- compat/win32/dirent.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 compat/win32/dirent.h (limited to 'compat/win32/dirent.h') diff --git a/compat/win32/dirent.h b/compat/win32/dirent.h new file mode 100644 index 000000000..927a25ca7 --- /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 */ -- cgit v1.2.1