On Wednesday, December 16, 2015, Johannes Schindelin <johannes.schindelin@xxxxxx> wrote: > 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@xxxxxx> > --- > diff --git a/compat/mingw.h b/compat/mingw.h > @@ -210,6 +210,24 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); > +static inline ssize_t mingw_write(int fd, const void *buf, size_t len) > +{ > + ssize_t result = write(fd, buf, len); > + > + if (result < 0 && errno == EINVAL && buf) { Here, errno is EINVAL... > + /* check if fd is a pipe */ > + HANDLE h = (HANDLE) _get_osfhandle(fd); > + if (GetFileType(h) == FILE_TYPE_PIPE) > + errno = EPIPE; > + else > + errno = EINVAL; Does any of the code between the outer 'if' and this point clobber errno, or are you merely assigning EINVAL for robustness against future changes? > + } > + > + return result; > +} > + > +#define write mingw_write > + > -- > 2.6.3.windows.1.300.g1c25e49 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html