- Timestamp:
- Mar 23, 2000, 8:21:56 PM (25 years ago)
- Location:
- trunk/src/wsock32
- Files:
-
- 2 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wsock32/new/asyncapi.cpp
r3198 r3205 1 /* $Id: asyncapi.cpp,v 1. 1 2000-03-22 20:01:04sandervl Exp $ */1 /* $Id: asyncapi.cpp,v 1.2 2000-03-23 19:21:53 sandervl Exp $ */ 2 2 3 3 /* … … 7 7 * Copyright (C) 2000 Sander van Leeuwen (sandervl@xs4all.nl) 8 8 * 9 * Based on Wine code: (dlls\winsock\async.c)9 * Parts based on Wine code: (dlls\winsock\async.c) 10 10 * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka. 11 11 * (C) 1999 Marcus Meissner … … 17 17 #include <os2wrap.h> 18 18 #include <stdio.h> 19 #include <stdlib.h> 19 20 #include <string.h> 20 21 #include <odin.h> … … 152 153 (WPARAM)pThreadParm->hAsyncTaskHandle, lParam); 153 154 } 154 RemoveFromQueue(pThreadParm);155 155 } 156 156 //****************************************************************************** … … 161 161 { 162 162 PASYNCTHREADPARM pThreadParm; 163 LHANDLE h Host = 0;164 LPSTR tempname ;165 LPSTR tempproto ;166 LPSTR tempaddr ;163 LHANDLE hAsyncRequest = 0; 164 LPSTR tempname = 0; 165 LPSTR tempproto = 0; 166 LPSTR tempaddr = 0; 167 167 168 168 if(!fWSAInitialized) … … 193 193 return 0; 194 194 } 195 memset(pThreadParm, 0, sizeof(*pThreadParm)); 195 196 pThreadParm->request= requesttype; 196 197 pThreadParm->hwnd = hwnd; … … 283 284 break; 284 285 } 285 return (LHANDLE)QueueAsyncJob(WSAsyncThreadProc, pThreadParm); 286 hAsyncRequest = (LHANDLE)QueueAsyncJob(WSAsyncThreadProc, pThreadParm); 287 if(hAsyncRequest == 0) { 288 free(pThreadParm); 289 if(tempname) free(tempname); 290 if(tempaddr) free(tempaddr); 291 if(tempproto) free(tempproto); 292 293 dprintf(("WSAAsyncRequest: QueueAsyncJob failure!")); 294 DebugInt3(); 295 WSASetLastError(WSAEFAULT); 296 return 0; 297 } 298 return hAsyncRequest; 286 299 } 287 300 return 0; … … 377 390 //****************************************************************************** 378 391 //****************************************************************************** 392 void AsyncNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error) 393 { 394 pThreadParm->u.asyncselect.lEventsPending &= ~event; 395 396 event = WSAMAKESELECTREPLY(event, socket_error); 397 398 PostMessageA(pThreadParm->hwnd, pThreadParm->msg, (WPARAM)pThreadParm->u.asyncselect.s, 399 (LPARAM)event); 400 } 401 //****************************************************************************** 402 #define nr(i) ((i != -1) ? 1 : 0) 403 #define ready(i) ((i != -1) && (sockets[i] != -1)) 404 //****************************************************************************** 405 void ASYNCCNV WSAsyncSelectThreadProc(void *pparm) 406 { 407 PASYNCTHREADPARM pThreadParm = (PASYNCTHREADPARM)pparm; 408 SOCKET sockets[3]; 409 SOCKET s = pThreadParm->u.asyncselect.s; 410 int noread, nowrite, noexcept, state, sockoptlen, sockoptval; 411 int tmp, i, lEventsPending, ret, bytesread; 412 413 while(TRUE) 414 { 415 asyncloopstart: 416 i = 0; 417 noread = nowrite = noexcept = -1; 418 419 //break if user cancelled request 420 if(pThreadParm->u.asyncselect.lEvents == 0) { 421 break; 422 } 423 424 lEventsPending = pThreadParm->u.asyncselect.lEventsPending; 425 //block if no events are pending 426 if(lEventsPending == 0) 427 { 428 //wait for events to be enabled 429 pThreadParm->u.asyncselect.asyncSem->wait(); 430 //reset event semaphore 431 pThreadParm->u.asyncselect.asyncSem->reset(); 432 continue; 433 } 434 435 if(lEventsPending & (FD_READ | FD_CLOSE | FD_ACCEPT)) { 436 noread = i++; 437 sockets[noread] = s; 438 } 439 if(lEventsPending & (FD_WRITE | FD_CONNECT)) { 440 nowrite = i++; 441 sockets[nowrite] = s; 442 } 443 if(lEventsPending & FD_OOB) { 444 noexcept = i++; 445 sockets[noexcept] = s; 446 } 447 448 dprintf(("WSAsyncSelectThreadProc %x wrs=%d, rds=%d, oos =%d, pending = %x", pThreadParm->u.asyncselect.s, noread, nowrite, noexcept, lEventsPending)); 449 450 ret = select((int *)sockets, nr(noread), nr(nowrite), nr(noexcept), -1); 451 if(ret == SOCKET_ERROR) { 452 int selecterr = sock_errno(); 453 switch(selecterr) 454 { 455 case SOCEINTR: 456 goto asyncloopstart; //so_cancel was called 457 458 case SOCECONNRESET: 459 case SOCEPIPE: 460 if(lEventsPending & FD_CLOSE) 461 AsyncNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET); 462 463 //remote connection broken (so can't receive data anymore) 464 //but can still send 465 pThreadParm->u.asyncselect.lEventsPending &= ~(FD_READ | FD_ACCEPT); 466 goto asyncloopstart; 467 468 case SOCEINVAL: 469 if(lEventsPending & FD_CLOSE) 470 AsyncNotifyEvent(pThreadParm, FD_CLOSE, selecterr); 471 break; 472 default: 473 dprintf(("WSAsyncSelectThreadProc: select SOCKET_ERROR %x", selecterr)); 474 break; //something bad happened 475 } 476 break; 477 } 478 479 if(ready(nowrite)) 480 { 481 state = ioctl(s, FIOBSTATUS, (char *)&tmp, sizeof(tmp)); 482 483 if(lEventsPending & FD_CONNECT) { 484 if(state & SS_ISCONNECTED) { 485 AsyncNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR); 486 } 487 else { 488 sockoptlen = sizeof(int); 489 490 ret = getsockopt(s, SOL_SOCKET, SO_ERROR, 491 (char *) &sockoptval, &sockoptlen); 492 if(sockoptval == (WSAECONNREFUSED-WSABASEERR)) { 493 AsyncNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED); 494 } 495 } 496 } 497 else 498 if(!(state & SS_CANTSENDMORE) && (lEventsPending & FD_WRITE)) { 499 AsyncNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR); 500 } 501 } 502 503 if(ready(noread)) 504 { 505 state = ioctl(s, FIONREAD, (CHAR *) &bytesread, sizeof(bytesread)); 506 if(state == SOCKET_ERROR) { 507 if(lEventsPending & FD_CLOSE) 508 { 509 AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR); 510 //remote connection broken (so can't receive data anymore) 511 //but can still send 512 pThreadParm->u.asyncselect.lEventsPending &= ~(FD_READ | FD_ACCEPT); 513 continue; 514 } 515 else { 516 dprintf(("WSAsyncSelectThreadProc: ioctl SOCKET_ERROR!")); 517 break; //todo: correct??? 518 } 519 } 520 if(lEventsPending & FD_ACCEPT) 521 { 522 sockoptlen = sizeof(sockoptlen); 523 524 ret = getsockopt(s, SOL_SOCKET, SO_OPTIONS, 525 (char *) &sockoptval, &sockoptlen); 526 if(ret == SOCKET_ERROR) { 527 dprintf(("WSAsyncSelectThreadProc: getsockopt SOCKET_ERROR!")); 528 break; 529 } 530 if((sockoptval & SO_ACCEPTCONN) == SO_ACCEPTCONN) { 531 AsyncNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR); 532 } 533 } 534 if((lEventsPending & FD_READ) && bytesread > 0) { 535 AsyncNotifyEvent(pThreadParm, FD_READ, NO_ERROR); 536 } 537 } 538 if(ready(noexcept)) 539 { 540 if(lEventsPending & FD_OOB) { 541 AsyncNotifyEvent(pThreadParm, FD_OOB, NO_ERROR); 542 } 543 } 544 if((pThreadParm->u.asyncselect.lEventsPending & (FD_ACCEPT|FD_CLOSE|FD_CONNECT)) == 545 (lEventsPending & (FD_ACCEPT|FD_CLOSE|FD_CONNECT))) { 546 DosSleep(10); 547 } 548 } 549 delete pThreadParm->u.asyncselect.asyncSem; 550 } 551 //****************************************************************************** 552 //****************************************************************************** 379 553 ODINFUNCTION4(int,WSAAsyncSelect, 380 554 SOCKET,s, … … 383 557 long,lEvent) 384 558 { 385 return SOCKET_ERROR; 386 } 387 //****************************************************************************** 388 //****************************************************************************** 559 PASYNCTHREADPARM pThreadParm; 560 int nonblock = 1; 561 int ret; 562 563 if(!fWSAInitialized) 564 { 565 WSASetLastError(WSANOTINITIALISED); 566 return SOCKET_ERROR; 567 } 568 else 569 if(WSAIsBlocking()) 570 { 571 WSASetLastError(WSAEINPROGRESS); // blocking call in progress 572 return SOCKET_ERROR; 573 } 574 else 575 if(hWnd && !IsWindow(hWnd)) 576 { 577 WSASetLastError(WSAEINVAL); // invalid parameter 578 return SOCKET_ERROR; 579 } 580 //Set socket to non-blocking mode 581 ret = ioctl(s, FIONBIO, (char *) &nonblock, sizeof(nonblock)); 582 if(ret == SOCKET_ERROR) { 583 WSASetLastError(wsaErrno()); 584 return SOCKET_ERROR; 585 } 586 if(FindAndSetAsyncEvent(s, hWnd, wMsg, lEvent) == TRUE) { 587 //found and changed active async event 588 WSASetLastError(NO_ERROR); 589 return NO_ERROR; 590 } 591 pThreadParm = (PASYNCTHREADPARM)malloc(sizeof(ASYNCTHREADPARM)); 592 if(pThreadParm == NULL) { 593 dprintf(("WSAAsyncSelect: malloc failure!")); 594 DebugInt3(); 595 WSASetLastError(WSAEFAULT); 596 return SOCKET_ERROR; 597 } 598 memset(pThreadParm, 0, sizeof(*pThreadParm)); 599 pThreadParm->request= ASYNC_SELECT; 600 pThreadParm->hwnd = hWnd; 601 pThreadParm->msg = wMsg; 602 pThreadParm->u.asyncselect.lEvents = lEvent; 603 pThreadParm->u.asyncselect.lEventsPending = lEvent; 604 pThreadParm->u.asyncselect.s = s; 605 pThreadParm->u.asyncselect.asyncSem = new VSemaphore; 606 if(pThreadParm->u.asyncselect.asyncSem == NULL) { 607 dprintf(("WSAAsyncSelect: VSemaphore alloc failure!")); 608 DebugInt3(); 609 WSASetLastError(WSAEFAULT); 610 return SOCKET_ERROR; 611 } 612 if(QueueAsyncJob(WSAsyncSelectThreadProc, pThreadParm) == 0) { 613 delete pThreadParm->u.asyncselect.asyncSem; 614 free(pThreadParm); 615 dprintf(("WSAAsyncSelect: QueueAsyncJob failure!")); 616 DebugInt3(); 617 WSASetLastError(WSAEFAULT); 618 return SOCKET_ERROR; 619 } 620 WSASetLastError(NO_ERROR); 621 return NO_ERROR; 622 } 623 //****************************************************************************** 624 //****************************************************************************** -
trunk/src/wsock32/new/asyncthread.cpp
r3198 r3205 1 /* $Id: asyncthread.cpp,v 1. 1 2000-03-22 20:01:04sandervl Exp $ */1 /* $Id: asyncthread.cpp,v 1.2 2000-03-23 19:21:53 sandervl Exp $ */ 2 2 3 3 /* … … 6 6 * Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl) 7 7 * 8 * 9 * Not everything is thread safe 8 * TODO: Not everything is 100% thread safe (i.e. async parameter updates) 10 9 * 11 10 * Project Odin Software License can be found in LICENSE.TXT 11 * 12 12 */ 13 13 #define INCL_BASE 14 14 #include <os2wrap.h> 15 15 #include <os2sel.h> 16 #include <stdlib.h> 16 17 #include <wprocess.h> 17 18 #include <win32api.h> … … 35 36 pThreadParm->asyncProc((PVOID)arg); 36 37 37 WSASetBlocking(TRUE, pThreadParm->hThread); 38 //only for blocking hooks (currently not implemented 39 //// if(pThreadParm->request == ASYNC_BLOCKHOOK) 40 //// WSASetBlocking(FALSE, pThreadParm->hThread); 41 42 pThreadParm->fActive = FALSE; 43 RemoveFromQueue(pThreadParm); 44 free((PVOID)pThreadParm); 38 45 39 46 DosExit(EXIT_THREAD, 0); … … 41 48 //****************************************************************************** 42 49 //****************************************************************************** 43 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm )50 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm, BOOL fSetBlocking) 44 51 { 45 52 APIRET rc; … … 55 62 AddToQueue(pThreadParm); 56 63 57 WSASetBlocking(TRUE);64 if(fSetBlocking) WSASetBlocking(TRUE); 58 65 59 66 rc = DosCreateThread(&tid, AsyncThread, (ULONG)pThreadParm, CREATE_READY, 16384); … … 61 68 { 62 69 dprintf(("QueueAsyncJob: DosCreateThread failed with error %x", rc)); 63 WSASetBlocking(FALSE);70 if(fSetBlocking) WSASetBlocking(FALSE); 64 71 RemoveFromQueue(pThreadParm); 65 72 WSASetLastError(WSAEFAULT); … … 83 90 void RemoveFromQueue(PASYNCTHREADPARM pThreadParm) 84 91 { 85 PASYNCTHREADPARM p arm;86 87 asyncThreadMutex.enter(); 88 p arm= threadList;89 90 if(p arm== pThreadParm) {92 PASYNCTHREADPARM pThreadInfo; 93 94 asyncThreadMutex.enter(); 95 pThreadInfo = threadList; 96 97 if(pThreadInfo == pThreadParm) { 91 98 threadList = pThreadParm->next; 92 99 } 93 100 else { 94 while(p arm->next) {95 if(p arm->next == pThreadParm) {96 p arm->next = pThreadParm->next;101 while(pThreadInfo->next) { 102 if(pThreadInfo->next == pThreadParm) { 103 pThreadInfo->next = pThreadParm->next; 97 104 break; 98 105 } 99 p arm = parm->next;100 } 101 if(p arm== NULL) {106 pThreadInfo = pThreadInfo->next; 107 } 108 if(pThreadInfo == NULL) { 102 109 dprintf(("RemoveFromQueue: parm %x not found!!", pThreadParm)); 103 110 DebugInt3(); … … 111 118 int WIN32API WSACancelAsyncRequest(LHANDLE hAsyncTaskHandle) 112 119 { 113 PASYNCTHREADPARM p arm;120 PASYNCTHREADPARM pThreadInfo; 114 121 BOOL found = FALSE; 115 122 116 123 dprintf(("WSACancelAsyncRequest: cancel task %x", hAsyncTaskHandle)); 117 124 asyncThreadMutex.enter(); 118 p arm= threadList;119 120 while(p arm) {121 if(p arm->hAsyncTaskHandle == hAsyncTaskHandle) {122 p arm->fCancelled = TRUE;125 pThreadInfo = threadList; 126 127 while(pThreadInfo) { 128 if(pThreadInfo->hAsyncTaskHandle == hAsyncTaskHandle) { 129 pThreadInfo->fCancelled = TRUE; 123 130 found = TRUE; 124 131 break; 125 132 } 126 p arm = parm->next;133 pThreadInfo = pThreadInfo->next; 127 134 } 128 135 asyncThreadMutex.leave(); … … 134 141 } 135 142 //****************************************************************************** 143 //Only to cancel blocking hooks 144 //****************************************************************************** 145 int WIN32API WSACancelBlockingCall() 146 { 147 HANDLE hThread = GetCurrentThread(); 148 149 dprintf(("WSACancelBlockingCall")); 150 #if 0 151 asyncThreadMutex.enter(); 152 pThreadInfo = threadList; 153 154 while(pThreadInfo) { 155 if(pThreadInfo->hThread == hThread) { 156 pThreadInfo->fCancelled = TRUE; 157 158 if(pThreadInfo->request == ASYNC_BLOCKHOOK) { 159 ret = so_cancel(pThreadInfo->blockedsocket); 160 } 161 162 found = TRUE; 163 break; 164 } 165 pThreadInfo = pThreadInfo->next; 166 } 167 asyncThreadMutex.leave(); 168 #endif 169 return SOCKET_ERROR; 170 } 171 //****************************************************************************** 172 //Assumes caller owns async thread mutex! 173 //****************************************************************************** 174 static PASYNCTHREADPARM FindAsyncEvent(SOCKET s) 175 { 176 PASYNCTHREADPARM pThreadInfo; 177 178 pThreadInfo = threadList; 179 while(pThreadInfo) { 180 if(pThreadInfo->u.asyncselect.s == s) { 181 return pThreadInfo; 182 } 183 pThreadInfo = pThreadInfo->next; 184 } 185 return NULL; 186 } 187 //****************************************************************************** 188 //****************************************************************************** 189 BOOL FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent) 190 { 191 PASYNCTHREADPARM pThreadInfo; 192 193 asyncThreadMutex.enter(); 194 pThreadInfo = FindAsyncEvent(s); 195 if(pThreadInfo) { 196 pThreadInfo->u.asyncselect.lEvents = lEvent; 197 pThreadInfo->hwnd = hwnd; 198 pThreadInfo->msg = msg; 199 //cancel pending select in async select thread (if any) 200 so_cancel(s); 201 202 //unblock async thread if it was waiting 203 pThreadInfo->u.asyncselect.asyncSem->post(); 204 } 205 asyncThreadMutex.leave(); 206 return(pThreadInfo != NULL); 207 } 208 //****************************************************************************** 136 209 //****************************************************************************** 137 210 void EnableAsyncEvent(SOCKET s, ULONG flags) 138 211 { 212 PASYNCTHREADPARM pThreadInfo; 213 214 asyncThreadMutex.enter(); 215 pThreadInfo = FindAsyncEvent(s); 216 if(pThreadInfo) { 217 pThreadInfo->u.asyncselect.lEventsPending |= (pThreadInfo->u.asyncselect.lEvents & flags); 218 //cancel pending select in async select thread (if any) 219 so_cancel(s); 220 221 //unblock async thread if it was waiting 222 pThreadInfo->u.asyncselect.asyncSem->post(); 223 } 224 asyncThreadMutex.leave(); 139 225 } 140 226 //****************************************************************************** … … 142 228 BOOL QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent) 143 229 { 144 return FALSE; 145 } 146 //****************************************************************************** 147 //****************************************************************************** 230 PASYNCTHREADPARM pThreadInfo; 231 232 asyncThreadMutex.enter(); 233 pThreadInfo = FindAsyncEvent(s); 234 if(pThreadInfo) { 235 *pHwnd = pThreadInfo->hwnd; 236 *pMsg = pThreadInfo->msg; 237 *plEvent = pThreadInfo->u.asyncselect.lEvents; 238 } 239 asyncThreadMutex.leave(); 240 return(pThreadInfo != NULL); 241 } 242 //****************************************************************************** 243 //****************************************************************************** -
trunk/src/wsock32/new/asyncthread.h
r3198 r3205 1 /* $Id: asyncthread.h,v 1. 1 2000-03-22 20:01:04 sandervl Exp $ */1 /* $Id: asyncthread.h,v 1.2 2000-03-23 19:21:54 sandervl Exp $ */ 2 2 3 3 /* … … 12 12 13 13 #include <vmutex.h> 14 #include <vsemaphore.h> 14 15 15 16 #define ASYNCCNV _Optlink … … 23 24 ASYNC_GETPROTOBYNUMBER, 24 25 ASYNC_GETSERVBYNAME, 25 ASYNC_GETSERVBYPORT 26 ASYNC_GETSERVBYPORT, 27 ASYNC_SELECT 26 28 } ; 27 29 … … 62 64 LPSTR proto; 63 65 } getservbyport; 66 struct { 67 VSemaphore *asyncSem; 68 DWORD lEvents; 69 DWORD lEventsPending; 70 SOCKET s; 71 } asyncselect; 64 72 } u; 65 73 _ASYNCTHREADPARM *next; 66 74 } ASYNCTHREADPARM, *PASYNCTHREADPARM; 67 75 68 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm );76 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm, BOOL fSetBlocking = FALSE); 69 77 void RemoveFromQueue(PASYNCTHREADPARM pThreadParm); 70 78 71 79 void EnableAsyncEvent(SOCKET s, ULONG flags); 72 80 BOOL QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent); 81 BOOL FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent); 73 82 74 83 #endif //__ASYNCTHREAD_H__ -
trunk/src/wsock32/new/wsa.cpp
r3198 r3205 1 /* $Id: wsa.cpp,v 1. 1 2000-03-22 20:01:07sandervl Exp $ */1 /* $Id: wsa.cpp,v 1.2 2000-03-23 19:21:54 sandervl Exp $ */ 2 2 3 3 /* … … 32 32 ODINDEBUGCHANNEL(WSOCK32-WSA) 33 33 34 #ifndef winsockcleanupsockets 35 // Exported by SO32DLL. Used to close all open sockets. 36 void _System winsockcleanupsockets(void); 37 #endif 38 34 39 static void WSASetBlocking(BOOL fBlock); 35 40 … … 53 58 if (!lpWSAData) return WSAEINVAL; 54 59 55 pwsi = WINSOCK_GetIData(); 56 if( pwsi == NULL ) 60 if(fWSAInitialized == FALSE) 57 61 { 58 62 WINSOCK_CreateIData(); 59 63 pwsi = WINSOCK_GetIData(); 60 if (!pwsi) return WSASYSNOTREADY; 61 } 64 65 sock_init(); 66 } 67 else pwsi = WINSOCK_GetIData(); 68 69 if (!pwsi) return WSASYSNOTREADY; 70 62 71 pwsi->num_startup++; 63 72 fWSAInitialized = TRUE; … … 75 84 if( pwsi ) { 76 85 if( --pwsi->num_startup > 0 ) return 0; 86 87 winsockcleanupsockets(); 77 88 78 89 fWSAInitialized = FALSE; … … 103 114 //TODO: Implement this 104 115 //****************************************************************************** 105 ODINFUNCTION0(int,WSACancelBlockingCall)106 {107 LPWSINFO pwsi = WINSOCK_GetIData();108 109 if( pwsi ) return 0;110 return SOCKET_ERROR;111 }112 //******************************************************************************113 //******************************************************************************114 116 ODINFUNCTION0(int,WSAUnhookBlockingHook) 115 117 { … … 126 128 //****************************************************************************** 127 129 //****************************************************************************** 128 ODINFUNCTION0(BOOL,WSAIsBlocking)130 BOOL WIN32API WSAIsBlocking() 129 131 { 130 132 LPWSINFO pwsi = WINSOCK_GetIData(); -
trunk/src/wsock32/new/wsock32.cpp
r3198 r3205 1 /* $Id: wsock32.cpp,v 1.1 6 2000-03-22 20:01:08sandervl Exp $ */1 /* $Id: wsock32.cpp,v 1.17 2000-03-23 19:21:54 sandervl Exp $ */ 2 2 3 3 /* … … 94 94 goto tryagain; 95 95 } 96 else{96 if(iData == NULL) { 97 97 dprintf(("WINSOCK_GetIData: couldn't find struct for thread %x", tid)); 98 98 DebugInt3();// should never happen!!!!!!! … … 145 145 //****************************************************************************** 146 146 //****************************************************************************** 147 ODINPROCEDURE1(WSASetLastError, 148 int,iError) 147 void WIN32API WSASetLastError(int iError) 149 148 { 150 149 // according to the docs, WSASetLastError() is just a call-through 151 150 // to SetLastError() 151 if(iError) { 152 dprintf(("WSASetLastError %x", iError)); 153 } 152 154 SetLastError(iError); 153 155 } 154 156 //****************************************************************************** 155 157 //****************************************************************************** 156 ODINFUNCTION0(int,WSAGetLastError)158 int WIN32API WSAGetLastError() 157 159 { 158 160 return GetLastError(); … … 232 234 233 235 //Close WSAAsyncSelect thread if one was created for this socket 234 EnableAsyncEvent(s, 0L);236 WSAAsyncSelect(s, 0, 0, 0); 235 237 236 238 if(ret == SOCKET_ERROR) { … … 291 293 return SOCKET_ERROR; 292 294 } 295 // clear high word (not used in OS/2's tcpip stack) 296 cmd = LOUSHORT(cmd); 297 293 298 if(cmd != FIONBIO && cmd != FIONREAD && cmd != SIOCATMARK) { 294 299 WSASetLastError(WSAEINVAL); … … 317 322 } 318 323 } 319 // clear high word (not used in OS/2's tcpip stack) 320 ret = ioctl(s, LOUSHORT(cmd), (char *)argp, sizeof(int)); 324 ret = ioctl(s, cmd, (char *)argp, sizeof(int)); 321 325 322 326 // Map EOPNOTSUPP to EINVAL … … 878 882 break; 879 883 default: 884 dprintf(("setsockopt: unknown option %x", optname)); 880 885 WSASetLastError(WSAENOPROTOOPT); 881 886 return SOCKET_ERROR; … … 892 897 } 893 898 else { 899 dprintf(("setsockopt: unknown option %x", optname)); 894 900 WSASetLastError(WSAENOPROTOOPT); 895 901 return SOCKET_ERROR; … … 974 980 break; 975 981 default: 982 dprintf(("getsockopt: unknown option %x", optname)); 976 983 WSASetLastError(WSAENOPROTOOPT); 977 984 return SOCKET_ERROR; … … 988 995 } 989 996 else { 997 dprintf(("getsockopt: unknown option %x", optname)); 990 998 WSASetLastError(WSAENOPROTOOPT); 991 999 return SOCKET_ERROR; -
trunk/src/wsock32/new/wsock32.h
r3198 r3205 1 /* $Id: wsock32.h,v 1. 4 2000-03-22 20:01:09sandervl Exp $ */1 /* $Id: wsock32.h,v 1.5 2000-03-23 19:21:55 sandervl Exp $ */ 2 2 3 3 /* WSOCK32.H--definitions & conversions for Odin's wsock32.dll. … … 24 24 #include <sys\time.h> 25 25 26 #include <odinwrap.h> 27 26 28 /* 27 29 * Socket state bits. … … 45 47 //socketopt options 46 48 #define SO_DONTLINGER (u_int)(~SO_LINGER) 49 50 #define WSAMAKESELECTREPLY(event,error) MAKELONG(event,error) 47 51 48 52 // WSAAsyncSelect flags … … 216 220 void WIN32API WSASetLastError(int iError); 217 221 int WIN32API WSAGetLastError(void); 222 int WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent); 218 223 BOOL WIN32API WSAIsBlocking(void); 219 int WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);220 224 221 225 extern BOOL fWSAInitialized;
Note:
See TracChangeset
for help on using the changeset viewer.