Bug #7758 ยป win32-bug-7758.diff
win32/win32.c | ||
---|---|---|
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);
|
||
... | ... | |
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 */
|
||
... | ... | |
#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;
|
||
... | ... | |
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;
|
||
... | ... | |
else
|
||
errno = map_errno(err);
|
||
MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock));
|
||
return -1;
|
||
ret = -1;
|
||
goto finish;
|
||
}
|
||
if (pol) {
|
||
... | ... | |
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,
|
||
... | ... | |
errno = map_errno(err);
|
||
CloseHandle(ol.hEvent);
|
||
cancel_io((HANDLE)_osfhnd(fd));
|
||
MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock));
|
||
return -1;
|
||
ret = -1;
|
||
goto finish;
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
goto retry;
|
||
}
|
||
finish:
|
||
#ifdef __MINGW32__
|
||
if (text) setmode(fd, O_TEXT);
|
||
#endif
|
||
MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock));
|
||
return ret;
|