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 <kusmabite@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
e7772600e9
commit
d1b6e6e015
@ -319,35 +319,6 @@ int main(int argc, const char **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
|
||||
|
||||
/*
|
||||
* Used by Pthread API implementation for Windows
|
||||
*/
|
||||
|
Reference in New Issue
Block a user