git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] mingw: emulate write(2) that fails with a EPIPE

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Dec 16, 2015, 12:14 UTC
Message-ID
<01da36219c18373f8507e19035e141d7e56b2d18.1450267413.git.johannes.schindelin@gmx.de>

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>
---
 compat/mingw.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
diff --git a/compat/mingw.h b/compat/mingw.h
index 738865c..2aca347 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -210,6 +210,24 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream);
 int mingw_fflush(FILE *stream);
 #define fflush mingw_fflush
 
+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) {
+		/* check if fd is a pipe */
+		HANDLE h = (HANDLE) _get_osfhandle(fd);
+		if (GetFileType(h) == FILE_TYPE_PIPE)
+			errno = EPIPE;
+		else
+			errno = EINVAL;
+	}
+
+	return result;
+}
+
+#define write mingw_write
+
 int mingw_access(const char *filename, int mode);
 #undef access
 #define access mingw_access
-- 
2.6.3.windows.1.300.g1c25e49
Next: Junio C Hamano
Message 1 of 13 in “mingw: emulate write(2) that fails with a EPIPE”
  1. mingw: emulate write(2) that fails with a EPIPEJohannes Schindelin, Dec 16, 2015
  2. Junio C HamanoDec 16, 2015
  3. Johannes SchindelinDec 17, 2015
  4. Junio C HamanoDec 17, 2015
  5. Johannes SchindelinDec 17, 2015
  6. Eric SunshineDec 16, 2015
  7. Junio C HamanoDec 16, 2015
  8. Johannes SchindelinDec 17, 2015
  9. mingw: emulate write(2) that fails with a EPIPEJohannes Schindelin, Dec 17, 2015
  10. Junio C HamanoDec 17, 2015
  11. Johannes SchindelinDec 18, 2015
  12. Johannes SixtDec 18, 2015
  13. Junio C HamanoDec 21, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.