maybe_flush_or_die: move a too-loose Windows specific error
check to compat
Commit b2f5e268
(Windows: Work around an oddity when a pipe with no reader
is written to) introduced a check for EINVAL after fflush() to fight
spurious "Invalid argument" errors on Windows when a pipe was broken. But
this check may hide real errors on systems that do not have the this odd
behavior. Introduce an fflush wrapper in compat/mingw.* so that the treatment
is only applied on Windows.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
bafc478f16
commit
84adb64154
@ -335,6 +335,28 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
|
|||||||
return freopen(filename, otype, stream);
|
return freopen(filename, otype, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef fflush
|
||||||
|
int mingw_fflush(FILE *stream)
|
||||||
|
{
|
||||||
|
int ret = fflush(stream);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* write() is used behind the scenes of stdio output functions.
|
||||||
|
* Since git code does not check for errors after each stdio write
|
||||||
|
* operation, it can happen that write() is called by a later
|
||||||
|
* stdio function even if an earlier write() call failed. In the
|
||||||
|
* case of a pipe whose readable end was closed, only the first
|
||||||
|
* call to write() reports EPIPE on Windows. Subsequent write()
|
||||||
|
* calls report EINVAL. It is impossible to notice whether this
|
||||||
|
* fflush invocation triggered such a case, therefore, we have to
|
||||||
|
* catch all EINVAL errors whole-sale.
|
||||||
|
*/
|
||||||
|
if (ret && errno == EINVAL)
|
||||||
|
errno = EPIPE;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
|
* The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
|
||||||
* Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
|
* Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
|
||||||
|
@ -185,6 +185,9 @@ FILE *mingw_fopen (const char *filename, const char *otype);
|
|||||||
FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream);
|
FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream);
|
||||||
#define freopen mingw_freopen
|
#define freopen mingw_freopen
|
||||||
|
|
||||||
|
int mingw_fflush(FILE *stream);
|
||||||
|
#define fflush mingw_fflush
|
||||||
|
|
||||||
char *mingw_getcwd(char *pointer, int len);
|
char *mingw_getcwd(char *pointer, int len);
|
||||||
#define getcwd mingw_getcwd
|
#define getcwd mingw_getcwd
|
||||||
|
|
||||||
|
@ -34,12 +34,7 @@ void maybe_flush_or_die(FILE *f, const char *desc)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (fflush(f)) {
|
if (fflush(f)) {
|
||||||
/*
|
if (errno == EPIPE)
|
||||||
* On Windows, EPIPE is returned only by the first write()
|
|
||||||
* after the reading end has closed its handle; subsequent
|
|
||||||
* write()s return EINVAL.
|
|
||||||
*/
|
|
||||||
if (errno == EPIPE || errno == EINVAL)
|
|
||||||
exit(0);
|
exit(0);
|
||||||
die_errno("write failure on '%s'", desc);
|
die_errno("write failure on '%s'", desc);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user