diff options
author | Johannes Sixt <johannes.sixt@telecom.at> | 2007-08-17 18:40:36 +0200 |
---|---|---|
committer | Johannes Sixt <johannes.sixt@telecom.at> | 2008-06-26 08:47:15 +0200 |
commit | b2f5e2684da060dd821bf90f88df8b6dc9401a40 (patch) | |
tree | 8c3a39cd7085a5ce0e5b0cbd251768a0c3f236e1 /write_or_die.c | |
parent | bfdd9ffd2f7376ccb8b9d4c4e39e2e0fe97d6b37 (diff) | |
download | git-b2f5e2684da060dd821bf90f88df8b6dc9401a40.tar.gz git-b2f5e2684da060dd821bf90f88df8b6dc9401a40.tar.xz |
Windows: Work around an oddity when a pipe with no reader is written to.
On Windows, write() is implemented using WriteFile(). After the reader
closed its end of the pipe, the first WriteFile() returns
ERROR_BROKEN_PIPE (which translates to EPIPE), subsequent WriteFile()s
return ERROR_NO_DATA, which is translated to EINVAL.
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Diffstat (limited to 'write_or_die.c')
-rw-r--r-- | write_or_die.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/write_or_die.c b/write_or_die.c index 630be4cb9..e4c8e225f 100644 --- a/write_or_die.c +++ b/write_or_die.c @@ -34,7 +34,12 @@ void maybe_flush_or_die(FILE *f, const char *desc) return; } 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); die("write failure on %s: %s", desc, strerror(errno)); } |