From: Junio C Hamano Date: Tue, 22 Dec 2015 22:45:16 +0000 (-0800) Subject: Merge branch 'js/emu-write-epipe-on-windows' X-Git-Tag: v2.7.0-rc2~1 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/de60b97422c87abf6ef4ba62bdc81f2671af405b?ds=inline;hp=-c Merge branch 'js/emu-write-epipe-on-windows' The write(2) emulation for Windows learned to set errno to EPIPE when necessary. * js/emu-write-epipe-on-windows: mingw: emulate write(2) that fails with a EPIPE --- de60b97422c87abf6ef4ba62bdc81f2671af405b diff --combined compat/mingw.c index 90bdb1edde,1d70f649fb..5edea29508 --- a/compat/mingw.c +++ b/compat/mingw.c @@@ -394,6 -394,23 +394,23 @@@ int mingw_fflush(FILE *stream return ret; } + #undef write + 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; + } + int mingw_access(const char *filename, int mode) { wchar_t wfilename[MAX_PATH]; @@@ -2131,13 -2148,11 +2148,13 @@@ void mingw_startup( int uname(struct utsname *buf) { - DWORD v = GetVersion(); + unsigned v = (unsigned)GetVersion(); memset(buf, 0, sizeof(*buf)); - strcpy(buf->sysname, "Windows"); - sprintf(buf->release, "%u.%u", v & 0xff, (v >> 8) & 0xff); + xsnprintf(buf->sysname, sizeof(buf->sysname), "Windows"); + xsnprintf(buf->release, sizeof(buf->release), + "%u.%u", v & 0xff, (v >> 8) & 0xff); /* assuming NT variants only.. */ - sprintf(buf->version, "%u", (v >> 16) & 0x7fff); + xsnprintf(buf->version, sizeof(buf->version), + "%u", (v >> 16) & 0x7fff); return 0; }