Project

General

Profile

Bug #7758 ยป win32-bug-7758.diff

nobu (Nobuyoshi Nakada), 02/15/2013 01:38 PM

View differences:

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;
    (1-1/1)