diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-12-23 01:45:16 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-12-23 01:45:16 +0300 |
commit | de60b97422c87abf6ef4ba62bdc81f2671af405b (patch) | |
tree | 824180ef873723d30b55c958c4ffb72cd5044f17 /compat | |
parent | 6a4f2eced4036b7330742af91e8ea71e3c8b9803 (diff) | |
parent | 2b86292ed1756a66439f79ceda88dfc86a10dfa9 (diff) |
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
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 17 | ||||
-rw-r--r-- | compat/mingw.h | 3 |
2 files changed, 20 insertions, 0 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index 90bdb1edde..5edea29508 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -394,6 +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]; diff --git a/compat/mingw.h b/compat/mingw.h index 738865c6c0..57ca477d1f 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -210,6 +210,9 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); int mingw_fflush(FILE *stream); #define fflush mingw_fflush +ssize_t mingw_write(int fd, const void *buf, size_t len); +#define write mingw_write + int mingw_access(const char *filename, int mode); #undef access #define access mingw_access |