mingw: emulate write(2) that fails with a EPIPE
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 17 Dec 2015 17:08:15 +0000 (18:08 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Dec 2015 16:59:04 +0000 (08:59 -0800)
commit2b86292ed1756a66439f79ceda88dfc86a10dfa9
treec0ff36f0a1ddf08a2d08d16f5a96d379f2deb5f5
parent1ff88560c8d22bcdb528a6629239d638f927cb96
mingw: emulate write(2) that fails with a EPIPE

On Windows, when writing to a pipe fails, errno is always
EINVAL. However, Git expects it to be EPIPE.

According to the documentation, there are two cases in which write()
triggers EINVAL: the buffer is NULL, or the length is odd but the mode
is 16-bit Unicode (the broken pipe is not mentioned as possible cause).
Git never sets the file mode to anything but binary, therefore we know
that errno should actually be EPIPE if it is EINVAL and the buffer is
not NULL.

See https://msdn.microsoft.com/en-us/library/1570wh78.aspx for more
details.

This works around t5571.11 failing with v2.6.4 on Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
compat/mingw.h