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_Write(TReadWriteInfo *pInfo)
00028 {
00029 int iRet;
00030
00031 if (_setmode(pInfo->fildes, _O_BINARY) != -1)
00032 {
00033 errno = 0;
00034 return _write(pInfo->fildes, pInfo->buf, pInfo->nbyte);
00035 }
00036 else
00037 {
00038 DWORD dwWritten;
00039 if (!WriteFile((HANDLE) pInfo->fildes, pInfo->buf, pInfo->nbyte,
00040 &dwWritten, NULL))
00041 {
00042 SetErrnoFromWinError(GetLastError());
00043 return -1;
00044 }
00045 else
00046 return dwWritten;
00047 }
00048 }
00049
00055 int _win_write(int fildes, const void *buf, size_t nbyte)
00056 {
00057 if (_win_isSocketValid(fildes))
00058 {
00059 return _win_send(fildes, buf, nbyte, 0);
00060 }
00061 else
00062 {
00063 TReadWriteInfo theInfo;
00064 theInfo.fildes = fildes;
00065 theInfo.buf = (void *) buf;
00066 theInfo.nbyte = nbyte;
00067
00068 if (__win_IsHandleMarkedAsBlocking(fildes))
00069 return __win_Write(&theInfo);
00070 else
00071 {
00072 DWORD dwTID;
00073 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) __win_Write, &theInfo, 0, &dwTID);
00074 return 1;
00075 }
00076 }
00077 }
00078
00079