Changeset 1385 for trunk/src/wsock32/wsock32.cpp
- Timestamp:
- Oct 20, 1999, 10:41:54 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wsock32/wsock32.cpp
r1384 r1385 1 /* $Id: wsock32.cpp,v 1. 8 1999-10-20 20:10:58phaller Exp $ */1 /* $Id: wsock32.cpp,v 1.9 1999-10-20 20:41:54 phaller Exp $ */ 2 2 3 3 /* … … 67 67 *****************************************************************************/ 68 68 69 #define GETSERVBYNAME 170 #define GETSERVBYPORT 271 #define GETPROTOBYNAME 372 #define GETPROTOBYNUMBER 473 #define GETHOSTBYNAME 574 #define GETHOSTBYADDR 675 76 #define BLOCKING 077 #define NONBLOCKING 178 69 79 70 #ifdef FD_CLR … … 89 80 90 81 82 // forwarder prototypes 83 void _System SetLastError(int iError); 84 int _System GetLastError(void); 85 86 91 87 /***************************************************************************** 92 88 * Structures * 93 89 *****************************************************************************/ 94 95 typedef struct WSAStruct96 {97 int CallingWhat;98 HWND hw;99 u_int msg;100 char *carg1;101 char *carg2;102 int iarg1;103 int iarg2;104 char *buf;105 int buflen;106 } WSAStruct;107 108 typedef struct PipeStruct109 {110 AsyncStatus as;111 int MsgLoop;112 HFILE rcv;113 HFILE snd;114 } PipeStruct;115 90 116 91 typedef struct sockaddr* PSOCKADDR; … … 136 111 *****************************************************************************/ 137 112 138 void _System AsyncLoop (ULONG);139 void CheckThreads (AsyncStatus *);140 void NotifyApp (int,AsyncStatus *);141 int Notify (AsyncStatus *,int);142 int NotifyWSA (HWND hw,u_int msg,UINT wp,LONG lp);143 void _System WSAFunct (ULONG); // for the wsa database calls144 void SetErrForDatabaseCalls(void);145 146 113 147 114 /***************************************************************************** … … 149 116 *****************************************************************************/ 150 117 118 // @@@PH not reentrancy proof 151 119 static WHOSTENT whsnt; 152 120 static WSERVENT wsvnt; 153 121 static WPROTOENT wptnt; 154 size_t nSize;155 int *pArray;156 157 int MsgSent;158 int LocalErrorNumber = 0;159 160 TID tidAsyncLoop = 0; /* ID of AsyncSelect (AsyncLoop) thread */161 162 PipeStruct PS;163 164 AsyncStatus *TopASY = 0;165 166 167 /*168 typedef struct AsyncStatus {169 HWND hwnd; // owner's hwindow170 u_int msg; // message to send when event occurs171 long event; // event that may occur172 SOCKET socket; // the socket173 int status; // blocking yes/no174 TID threadID; // Thread ID for async175 int MsgStat; // has message been sent yet?176 struct AsyncStatus *Next; // pointer to next AsyncStatus in the list177 struct AsyncStatus *Prev; // pointer to previous AsyncStatus in the list178 } AsyncStatus;179 */180 181 182 /*****************************************************************************183 * Name :184 * Purpose :185 * Parameters:186 * Variables :187 * Result :188 * Remark :189 * Status : UNTESTED STUB190 *191 * Author : Patrick Haller [Tue, 1998/06/16 23:00]192 *****************************************************************************/193 194 void _System AsyncLoop(ULONG ASP)195 {196 int socks[1],r,w,e,rc,ii;197 AsyncStatus *as;198 199 as = (AsyncStatus *)ASP;200 201 r = w = e = 0;202 if(as->event & FD_READ) r = 1;203 if(as->event & FD_WRITE) w = 1;204 if(as->event & FD_OOB) e = 1;205 206 socks[0] = (int)as->socket;207 208 if((r+w+e) == 0)209 {210 dprintf(("WSOCK32: Turning off async\n"));211 212 ii = 0;213 rc = ioctl(socks[0],FIONBIO,(char *)&ii,sizeof(ii));214 as->threadID = 0;215 as->hwnd = 0;216 as->msg = 0;217 as->event = 0;218 as->status = BLOCKING;219 return;220 } // end if221 else222 {223 dprintf(("WSOCK32: Setting up non-blocking sockets\n"));224 ii = 1;225 rc = ioctl(socks[0],FIONBIO,(char *)&ii,sizeof(ii));226 if(rc != 0)227 {228 dprintf(("WSOCK32: ioctl failed trying to non-block.\n"));229 return;230 }231 as->status = NONBLOCKING;232 } // end else233 234 do235 {236 rc = select(socks[0],(fd_set*)&r,0,0,0); // ioctl may be better for this.237 if(rc > 0)238 {239 rc = ioctl(socks[0],FIONREAD,(char *)&ii,sizeof(ii));240 if(rc == 0 && ii > 0)241 {242 /* data is ready */243 NotifyApp(FD_READ,as);244 }245 }246 247 if(rc < 0)248 {249 rc = sock_errno();250 /* something ain't right */251 if(rc == 10038)252 { // Connection closed253 NotifyApp(FD_CLOSE,as);254 DosSleep(500);255 return;256 }257 258 dprintf(("WSOCK32: Select error: %d\n",259 rc));260 } // end if261 DosSleep(50);262 }263 while(1);264 }265 266 267 /*****************************************************************************268 * Name :269 * Purpose :270 * Parameters:271 * Variables :272 * Result :273 * Remark :274 * Status : UNTESTED STUB275 *276 * Author : Patrick Haller [Tue, 1998/06/16 23:00]277 *****************************************************************************/278 279 void CheckThreads(AsyncStatus *as)280 {281 AsyncStatus *asy;282 283 if(as != NULL)284 if(as->threadID != 0) DosKillThread(as->threadID);285 286 for(asy = TopASY; asy; asy = asy->Next)287 if(asy->threadID != 0)288 DosKillThread(asy->threadID);289 }290 291 292 /*****************************************************************************293 * Name :294 * Purpose :295 * Parameters:296 * Variables :297 * Result :298 * Remark :299 * Status : UNTESTED STUB300 *301 * Author : Patrick Haller [Tue, 1998/06/16 23:00]302 *****************************************************************************/303 304 void NotifyApp(int xx,AsyncStatus *as)305 {306 BOOL fResult; /* message-posted indicator */307 unsigned long ii;308 309 310 //#ifdef DEBUG311 // WriteLog("WSOCK32: Notifying the caller. rc = %d\n",xx);312 //#endif313 314 if(as->MsgStat == 0)315 {316 fResult = Notify(as,xx);317 dprintf(("WSOCK32: Notify returns: %d\n",318 fResult));319 } // end if320 321 if(as->MsgStat == 2)322 as->MsgStat = 0;323 else324 as->MsgStat = 1;325 }326 327 328 /*****************************************************************************329 * Name :330 * Purpose :331 * Parameters:332 * Variables :333 * Result :334 * Remark :335 * Status : UNTESTED STUB336 *337 * Author : Patrick Haller [Tue, 1998/06/16 23:00]338 *****************************************************************************/339 340 void _System WSAFunct(ULONG xx)341 {342 WSAStruct *wsa;343 WSERVENT *ooo;344 char *yy;345 int ii;346 size_t ss;347 UINT wp;348 LONG lp;349 int id = *_threadid;350 351 wsa = (WSAStruct *)xx;352 353 dprintf(("WSOCK32: WSAFunct: xx = %p, hwnd = %p\n",354 xx,355 wsa->hw));356 357 dprintf(("WSOCK32: WSAFunct info carg1 = %s, carg2 = %s\n",358 wsa->carg1,359 wsa->carg2));360 361 dprintf(("WSOCK32: WSAFunct info buf = %p, %d\n",362 wsa->buf,363 wsa->buflen));364 365 switch (wsa->CallingWhat)366 {367 case GETSERVBYNAME:368 yy = (char *)OS2getservbyname(wsa->carg1,wsa->carg2);369 ss = sizeof(WSERVENT);370 break;371 case GETSERVBYPORT:372 yy = (char *)OS2getservbyport(wsa->iarg1,wsa->carg1);373 break;374 case GETPROTOBYNUMBER:375 yy = (char *)OS2getprotobynumber(wsa->iarg1);376 break;377 case GETPROTOBYNAME:378 yy = (char *)OS2getprotobyname(wsa->carg1);379 break;380 case GETHOSTBYNAME:381 yy = (char *)OS2gethostbyname(wsa->carg1);382 break;383 case GETHOSTBYADDR:384 yy = (char *)OS2gethostbyaddr(wsa->carg1,wsa->iarg1,wsa->iarg2);385 break;386 default:387 yy = (char *)NULL;388 OS2WSASetLastError(-5000);389 break;390 } // end switch391 392 #ifdef DEBUG393 if(yy)394 {395 ooo = (WSERVENT *)yy;396 dprintf(("WSOCK32: WSAFunct service name = %s, port = %d\n",397 ooo->s_name,398 (int)ooo->s_port));399 }400 #endif401 402 wp = id;403 404 if(yy == (char *)NULL)405 {406 dprintf(("WSOCK32: WSAFunct error carg1 = %s, carg2 = %s\n",407 wsa->carg1,408 wsa->carg2));409 410 ii = OS2WSAGetLastError();411 lp = OS2WSAMAKEASYNCREPLY(0,ii);412 } // end if413 else414 {415 if(wsa->buflen < ss)416 ii = WSAENOBUFS;417 else418 ii = 0;419 420 lp = OS2WSAMAKEASYNCREPLY(ss,ii);421 if(ii == 0)422 memmove(wsa->buf,yy,ss);423 }424 425 do426 {427 if(WinQueryAnchorBlock(wsa->hw))428 ii = NotifyWSA(wsa->hw,wsa->msg,wp,lp);429 } while(ii != TRUE);430 431 free(wsa);432 }433 122 434 123 … … 482 171 *****************************************************************************/ 483 172 484 AsyncStatus * FindASY(SOCKET s)485 {486 AsyncStatus *as;487 488 for(as = TopASY; as; as = as->Next)489 if(as->socket == s)490 return as;491 492 return NULL;493 }494 495 496 /*****************************************************************************497 * Name :498 * Purpose :499 * Parameters:500 * Variables :501 * Result :502 * Remark :503 * Status : UNTESTED STUB504 *505 * Author : Patrick Haller [Tue, 1998/06/16 23:00]506 *****************************************************************************/507 508 173 ODINFUNCTION2(int, OS2__WSAFDIsSet, SOCKET, fd, 509 174 Wfd_set FAR*, set) … … 573 238 ODINFUNCTION1(int,OS2closesocket,SOCKET,s) 574 239 { 575 AsyncStatus *as;576 577 as = FindASY(s);578 if(as == NULL)579 {580 LocalErrorNumber = 10038;581 return -1;582 }583 584 CheckThreads(as);585 586 if(as->Prev && as->Next)587 as->Prev->Prev = as->Next->Next; // I SURE HOPE THIS IS RIGHT!!!!!!!!588 589 free(as);590 591 240 return soclose((int)s); 592 241 } … … 841 490 int, flags) 842 491 { 843 unsigned long ii; 844 int xx, 845 yy; 846 char buff[200]; 847 AsyncStatus *as; 848 849 PS.MsgLoop = 0; 850 851 as = FindASY(s); 852 853 if(as != NULL) 854 as->MsgStat = 2; 855 856 xx = recv(s,buf,len,flags); 857 858 return xx; 492 return recv(s,buf,len,flags); 859 493 } 860 494 … … 1029 663 int,protocol) 1030 664 { 1031 SOCKET s; 1032 AsyncStatus *as; 1033 1034 s = (SOCKET)socket(af,type,protocol); 1035 if(s > 0) 1036 { 1037 as = (AsyncStatus *)malloc(sizeof(AsyncStatus)); 1038 if(as != NULL) 1039 { 1040 as->hwnd = (HWND)0; 1041 as->msg = 0; 1042 as->event = 0L; 1043 as->socket = s; 1044 as->status = BLOCKING; 1045 as->threadID = 0; 1046 as->MsgStat = 0; 1047 as->Next = TopASY; 1048 as->Prev = NULL; 1049 1050 if(TopASY) 1051 TopASY->Prev = as; 1052 1053 TopASY = as; 1054 } 1055 else 1056 { 1057 soclose(s); 1058 return -1; 1059 } 1060 } 1061 1062 return s; 665 return (SOCKET)socket(af,type,protocol); 1063 666 } 1064 667 … … 1321 924 lpWsaData->iMaxSockets = 2048; 1322 925 strcpy(lpWsaData->szSystemStatus,"No Status"); 1323 1324 LocalErrorNumber = 0;1325 926 1326 927 if(sock_init() == 0) … … 1352 953 ODINFUNCTION0(int,OS2WSACleanup) 1353 954 { 1354 CheckThreads((AsyncStatus *)NULL);1355 1356 955 return 0; 1357 956 } … … 1372 971 ODINPROCEDURE1(OS2WSASetLastError,int,iError) 1373 972 { 1374 LocalErrorNumber = iError;973 SetLastError(iError); 1375 974 } 1376 975 … … 1390 989 ODINFUNCTION0(int,OS2WSAGetLastError) 1391 990 { 1392 int ii; 1393 1394 if(LocalErrorNumber == 0) 1395 { 1396 ii = sock_errno(); // WSAGetLastError(); 1397 return ii; 1398 } 1399 else 1400 { 1401 return LocalErrorNumber; 1402 } 991 return GetLastError(); 1403 992 } 1404 993
Note:
See TracChangeset
for help on using the changeset viewer.