Merge branch 'js/emu-write-epipe-on-windows'
authorJunio C Hamano <gitster@pobox.com>
Tue, 22 Dec 2015 22:45:16 +0000 (14:45 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 22 Dec 2015 22:45:16 +0000 (14:45 -0800)
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

1  2 
compat/mingw.c
diff --combined compat/mingw.c
index 90bdb1edde15ccd39055c376f5d920c29af013c0,1d70f649fb17c016c93a7c7f748e6a7271b7d782..5edea29508d06fdc2daea540edadffdebd54173e
@@@ -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;
  }