diff --git a/win32/win32.c b/win32/win32.c index 984e03b..c4d1180 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -6041,6 +6041,9 @@ rb_w32_write(int fd, const void *buf, size_t size) size_t len; size_t ret; OVERLAPPED ol, *pol = NULL; +#ifdef __MINGW32__ + int text = 0; +#endif if (is_socket(sock)) return rb_w32_send(fd, buf, size, 0); @@ -6065,7 +6068,14 @@ rb_w32_write(int fd, const void *buf, size_t size) ret = 0; retry: /* get rid of console writing bug */ - len = (_osfile(fd) & FDEV) ? min(32 * 1024, size) : size; + len = size; + if (_osfile(fd) & FDEV) { + len = min(32 * 1024, size); +#ifdef __MINGW32__ + text = (_osfile(fd) & FTEXT); + setmode(fd, O_BINARY); +#endif + } size -= len; /* if have cancel_io, use Overlapped I/O */ @@ -6080,8 +6090,8 @@ rb_w32_write(int fd, const void *buf, size_t size) #endif if (low == INVALID_SET_FILE_POINTER) { errno = map_errno(GetLastError()); - MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + ret = -1; + goto finish; } ol.Offset = low; ol.OffsetHigh = high; @@ -6089,8 +6099,8 @@ rb_w32_write(int fd, const void *buf, size_t size) ol.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); if (!ol.hEvent) { errno = map_errno(GetLastError()); - MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + ret = -1; + goto finish; } pol = &ol; @@ -6105,8 +6115,8 @@ rb_w32_write(int fd, const void *buf, size_t size) else errno = map_errno(err); - MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + ret = -1; + goto finish; } if (pol) { @@ -6118,8 +6128,8 @@ rb_w32_write(int fd, const void *buf, size_t size) errno = map_errno(GetLastError()); CloseHandle(ol.hEvent); cancel_io((HANDLE)_osfhnd(fd)); - MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + ret = -1; + goto finish; } if (!GetOverlappedResult((HANDLE)_osfhnd(fd), &ol, &written, @@ -6127,8 +6137,8 @@ rb_w32_write(int fd, const void *buf, size_t size) errno = map_errno(err); CloseHandle(ol.hEvent); cancel_io((HANDLE)_osfhnd(fd)); - MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + ret = -1; + goto finish; } } } @@ -6152,6 +6162,11 @@ rb_w32_write(int fd, const void *buf, size_t size) goto retry; } + finish: +#ifdef __MINGW32__ + if (text) setmode(fd, O_TEXT); +#endif + MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); return ret;