00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00025 #include "plibc_private.h"
00026
00027 DWORD WINAPI __win_Read(TReadWriteInfo *pInfo)
00028 {
00029 if (_setmode(pInfo->fildes, _O_BINARY) != -1)
00030 {
00031 errno = 0;
00032 return _read(pInfo->fildes, pInfo->buf, pInfo->nbyte);
00033 }
00034 else
00035 {
00036 DWORD dwRead;
00037
00038 errno = 0;
00039 if (!ReadFile((HANDLE) pInfo->fildes, pInfo->buf, pInfo->nbyte, &dwRead,
00040 NULL))
00041 {
00042 SetErrnoFromWinError(GetLastError());
00043 return -1;
00044 }
00045 else
00046 return dwRead;
00047 }
00048 }
00049
00055 int _win_read(int fildes, void *buf, size_t nbyte)
00056 {
00057 if (_win_isSocketValid(fildes))
00058 return _win_recv(fildes, (char *) buf, nbyte, 0);
00059 else
00060 {
00061 TReadWriteInfo theInfo;
00062 theInfo.fildes = fildes;
00063 theInfo.buf = buf;
00064 theInfo.nbyte = nbyte;
00065
00066 if (__win_IsHandleMarkedAsBlocking(fildes))
00067 return __win_Read(&theInfo);
00068 else
00069 {
00070 DWORD dwTID;
00071 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) __win_Read, &theInfo, 0, &dwTID);
00072 return 1;
00073 }
00074 }
00075 }
00076
00077