- Timestamp:
- Mar 22, 2000, 9:07:30 PM (25 years ago)
- Location:
- trunk/src/wsock32
- Files:
-
- 2 added
- 5 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wsock32/dbglocal.cpp
r3195 r3199 1 /* $Id: dbglocal.cpp,v 1. 2 2000-03-22 18:46:15sandervl Exp $ */1 /* $Id: dbglocal.cpp,v 1.3 2000-03-22 20:07:20 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 { 21 21 "initterm", 22 " wsastruct",22 "relaywin", 23 23 "wsock32", 24 24 "unknown", 25 25 "async", 26 "asyncthread", 27 "wsa" 26 "asyncthread" 28 27 }; 29 28 //****************************************************************************** -
trunk/src/wsock32/dbglocal.h
r3195 r3199 1 /* $Id: dbglocal.h,v 1. 2 2000-03-22 18:46:16sandervl Exp $ */1 /* $Id: dbglocal.h,v 1.3 2000-03-22 20:07:21 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 21 21 #define DBG_initterm 0 22 #define DBG_ wsastruct122 #define DBG_relaywin 1 23 23 #define DBG_wsock32 2 24 24 #define DBG_unknown 3 25 25 #define DBG_async 4 26 26 #define DBG_asyncthread 5 27 #define DBG_wsa 6 28 #define DBG_MAXFILES 7 27 #define DBG_MAXFILES 6 29 28 30 29 extern USHORT DbgEnabled[DBG_MAXFILES]; -
trunk/src/wsock32/makefile
r3195 r3199 1 # $Id: makefile,v 1.2 3 2000-03-22 18:46:16sandervl Exp $1 # $Id: makefile,v 1.24 2000-03-22 20:07:22 sandervl Exp $ 2 2 3 3 # … … 26 26 $(OBJDIR)\wsock32.obj \ 27 27 $(OBJDIR)\unknown.obj \ 28 $(OBJDIR)\wsa.obj \ 29 $(OBJDIR)\wsastruct.obj \ 28 $(OBJDIR)\relaywin.obj \ 30 29 $(OBJDIR)\wsock32rsrc.obj \ 31 30 $(OBJDIR)\initterm.obj \ 32 $(OBJDIR)\asyncapi.obj \33 $(OBJDIR)\asyncthread.obj \31 #$(OBJDIR)\async.obj \ 32 #$(OBJDIR)\asyncthread.obj \ 34 33 $(OBJDIR)\dbglocal.obj 35 34 … … 37 36 # Target name - name of the dll without extention and path. 38 37 TARGET = wsock32 39 40 CXXFLAGS = $(CXXFLAGS) -DNEW_ASYNC41 38 42 39 … … 64 61 $(OBJS) 65 62 $(TARGET).def 66 tcp32dll.lib so32dll.lib63 pmwsock.lib 67 64 $(PDWIN32_LIB)\kernel32.lib 68 65 $(PDWIN32_LIB)/user32.lib -
trunk/src/wsock32/unknown.cpp
r3195 r3199 1 /* $Id: unknown.cpp,v 1. 5 2000-03-22 18:46:18sandervl Exp $ */1 /* $Id: unknown.cpp,v 1.6 2000-03-22 20:07:25 sandervl Exp $ */ 2 2 3 3 /* … … 15 15 #include <misc.h> 16 16 #include <odinwrap.h> 17 #include "wsock32.h"18 17 19 18 #define DBG_LOCALLOG DBG_unknown … … 21 20 22 21 ODINDEBUGCHANNEL(WSOCK32-UNKNOWN) 22 23 /***************************************************************************** 24 * Prototypes & Types & Defines * 25 *****************************************************************************/ 26 27 typedef int SOCKET; 28 29 int _System rexec(char **, int, char *, char *, char *, int *); 30 int _System rcmd (char **, int, const char *, const char *, const char *, int *); 31 23 32 24 33 /***************************************************************************** … … 98 107 *****************************************************************************/ 99 108 100 ODINFUNCTION4(int, WSARecvEx, SOCKET, s,109 ODINFUNCTION4(int, OS2WSARecvEx, SOCKET, s, 101 110 char FAR*, buf, 102 111 int, len, -
trunk/src/wsock32/wsock32.cpp
r3195 r3199 1 /* $Id: wsock32.cpp,v 1.2 2 2000-03-22 18:46:19sandervl Exp $ */1 /* $Id: wsock32.cpp,v 1.23 2000-03-22 20:07:28 sandervl Exp $ */ 2 2 3 3 /* … … 8 8 * 9 9 * Copyright (C) 1999 Patrick Haller <phaller@gmx.net> 10 * Copyright (C) 2000 Sander van Leeuwen (sandervl@xs4all.nl)11 *12 * Some parts based on Wine code: (dlls\winsock\socket.c)13 * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka.14 10 * 15 11 */ … … 21 17 * -> open issue: WSASetLastError / WSAGetLastError 22 18 * call SetLastError / GetLastError according to docs 23 *24 * 2000/22/03 Complete rewrite -> got rid of pmwsock25 19 * 26 20 * identical structures: … … 44 38 *****************************************************************************/ 45 39 46 #define INCL_BASE 47 #include <os2wrap.h> //Odin32 OS/2 api wrappers 48 49 #include <string.h> 40 #include <pmwsock.h> 41 #include <odin.h> 50 42 #include <odinwrap.h> 51 43 #include <os2sel.h> 44 #include <misc.h> 45 #include <wprocess.h> 46 #include <heapstring.h> 47 #include <win32wnd.h> 52 48 #include <stdlib.h> 53 49 #include <win32api.h> 54 #include <win32wnd.h>55 #include <wprocess.h>56 #include <misc.h>57 50 58 51 #include "wsock32.h" 59 #include "wsastruct.h" 60 #include "asyncthread.h" 61 52 #include "relaywin.h" 62 53 #define DBG_LOCALLOG DBG_wsock32 63 54 #include "dbglocal.h" … … 71 62 *****************************************************************************/ 72 63 73 static LPWSINFO lpFirstIData = NULL; 74 75 //****************************************************************************** 76 //****************************************************************************** 77 LPWSINFO WINSOCK_GetIData(HANDLE tid) 78 { 79 LPWSINFO iData; 80 BOOL fCurrentThread = FALSE; 81 82 if(tid == CURRENT_THREAD) { 83 tid = GetCurrentThread(); 84 fCurrentThread = TRUE; 64 #define ERROR_SUCCESS 0 65 66 67 static WSOCKTHREADDATA wstdFallthru; // for emergency only 68 69 static HWND hwndRelay = NULL; // handle to our relay window 70 71 BOOL fWSAInitialized = FALSE; 72 73 /***************************************************************************** 74 * Prototypes * 75 *****************************************************************************/ 76 77 /***************************************************************************** 78 * Name : 79 * Purpose : 80 * Parameters: 81 * Variables : 82 * Result : 83 * Remark : free memory when thread dies 84 * Status : UNTESTED STUB 85 * 86 * Author : Patrick Haller [Tue, 1998/06/16 23:00] 87 *****************************************************************************/ 88 89 PWSOCKTHREADDATA iQueryWsockThreadData(void) 90 { 91 struct _THDB* pThreadDB = (struct _THDB*)GetThreadTHDB(); 92 PWSOCKTHREADDATA pwstd; 93 94 // check for existing pointer 95 if (pThreadDB != NULL) 96 { 97 if (pThreadDB->pWsockData == NULL) 98 { 99 // allocate on demand + initialize 100 pwstd = (PWSOCKTHREADDATA)HEAP_malloc (sizeof(WSOCKTHREADDATA)); 101 pThreadDB->pWsockData = (LPVOID)pwstd; 85 102 } 86 tryagain: 87 for (iData = lpFirstIData; iData; iData = iData->lpNextIData) { 88 if (iData->dwThisThread == tid) 89 break; 90 } 91 if(iData == NULL && fCurrentThread) { 92 WINSOCK_CreateIData(); 93 fCurrentThread = FALSE; //just to prevent infinite loops 94 goto tryagain; 95 } 96 else { 97 dprintf(("WINSOCK_GetIData: couldn't find struct for thread %x", tid)); 98 DebugInt3();// should never happen!!!!!!! 99 } 100 return iData; 101 } 102 //****************************************************************************** 103 //****************************************************************************** 104 BOOL WINSOCK_CreateIData(void) 105 { 106 LPWSINFO iData; 107 108 iData = (LPWSINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WSINFO)); 109 if (!iData) 110 return FALSE; 111 iData->dwThisThread = GetCurrentThread(); 112 iData->lpNextIData = lpFirstIData; 113 lpFirstIData = iData; 114 return TRUE; 115 } 116 //****************************************************************************** 117 //****************************************************************************** 118 void WINSOCK_DeleteIData(void) 119 { 120 LPWSINFO ppid, iData; 121 122 if (iData) { 123 ppid = lpFirstIData; 124 while(ppid) 125 { 126 iData = ppid; 127 ppid = ppid->lpNextIData; 128 129 if( iData->flags & WSI_BLOCKINGCALL ) 130 dprintf(("\tinside blocking call!\n")); 131 132 /* delete scratch buffers */ 133 134 if(iData->he) free(iData->he); 135 if(iData->se) free(iData->se); 136 if(iData->pe) free(iData->pe); 137 138 //// if( iData->buffer ) SEGPTR_FREE(iData->buffer); 139 //// if( iData->dbuffer ) SEGPTR_FREE(iData->dbuffer); 140 141 HeapFree(GetProcessHeap(), 0, iData); 142 } 143 } 144 } 145 //****************************************************************************** 146 //****************************************************************************** 147 ODINPROCEDURE1(WSASetLastError, 103 else 104 // use already allocated memory 105 pwstd = (PWSOCKTHREADDATA)pThreadDB->pWsockData; 106 } 107 108 if (pwstd == NULL) 109 pwstd = &wstdFallthru; // no memory and not allocated already 110 111 return pwstd; 112 } 113 114 115 #if 0 116 /***************************************************************************** 117 * Name : 118 * Purpose : 119 * Parameters: 120 * Variables : 121 * Result : 122 * Remark : 123 * Status : UNTESTED STUB 124 * 125 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 126 *****************************************************************************/ 127 128 #define CASEERR2(a) case SOC##a: case a: return WSA##a; 129 #define CASEERR1(a) case SOC##a: return WSA##a; 130 131 int iTranslateSockErrToWSock(int iError) 132 { 133 switch(iError) 134 { 135 CASEERR2(EINTR) 136 CASEERR2(EBADF) 137 CASEERR2(EACCES) 138 CASEERR2(EINVAL) 139 CASEERR2(EMFILE) 140 141 CASEERR1(EWOULDBLOCK) 142 CASEERR1(EINPROGRESS) 143 CASEERR1(EALREADY) 144 CASEERR1(ENOTSOCK) 145 // CASEERR1(EDESTADRREQ) 146 CASEERR1(EMSGSIZE) 147 CASEERR1(EPROTOTYPE) 148 CASEERR1(ENOPROTOOPT) 149 CASEERR1(EPROTONOSUPPORT) 150 CASEERR1(ESOCKTNOSUPPORT) 151 CASEERR1(EOPNOTSUPP) 152 CASEERR1(EPFNOSUPPORT) 153 CASEERR1(EAFNOSUPPORT) 154 CASEERR1(EADDRINUSE) 155 CASEERR1(EADDRNOTAVAIL) 156 CASEERR1(ENETDOWN) 157 CASEERR1(ENETUNREACH) 158 CASEERR1(ENETRESET) 159 CASEERR1(ECONNABORTED) 160 CASEERR1(ECONNRESET) 161 CASEERR1(ENOBUFS) 162 CASEERR1(EISCONN) 163 CASEERR1(ENOTCONN) 164 CASEERR1(ESHUTDOWN) 165 CASEERR1(ETOOMANYREFS) 166 CASEERR1(ETIMEDOUT) 167 CASEERR1(ECONNREFUSED) 168 CASEERR1(ELOOP) 169 CASEERR1(ENAMETOOLONG) 170 CASEERR1(EHOSTDOWN) 171 CASEERR1(EHOSTUNREACH) 172 173 CASEERR1(ENOTEMPTY) 174 // CASEERR(EPROCLIM) 175 // CASEERR(EUSERS) 176 // CASEERR(EDQUOT) 177 // CASEERR(ESTALE) 178 // CASEERR(EREMOTE) 179 // CASEERR(EDISCON) 180 181 182 default: 183 dprintf(("WSOCK32: Unknown error condition: %d\n", 184 iError)); 185 return iError; 186 } 187 } 188 189 #endif 190 191 192 193 194 195 196 197 /***************************************************************************** 198 * Name : 199 * Purpose : 200 * Parameters: 201 * Variables : 202 * Result : 203 * Remark : 204 * Status : UNTESTED STUB 205 * 206 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 207 *****************************************************************************/ 208 209 210 ODINPROCEDURE1(OS2WSASetLastError, 148 211 int,iError) 149 212 { 150 213 // according to the docs, WSASetLastError() is just a call-through 151 214 // to SetLastError() 215 WSASetLastError(iError); 152 216 SetLastError(iError); 153 217 } 154 //****************************************************************************** 155 //****************************************************************************** 156 ODINFUNCTION0(int,WSAGetLastError) 157 { 158 return GetLastError(); 159 } 160 //****************************************************************************** 161 //****************************************************************************** 162 ODINFUNCTION2(int,OS2shutdown, 163 SOCKET,s, 164 int,how) 165 { 166 int ret; 167 168 if(!fWSAInitialized) { 169 WSASetLastError(WSANOTINITIALISED); 170 return SOCKET_ERROR; 171 } 172 else 173 if(WSAIsBlocking()) { 174 WSASetLastError(WSAEINPROGRESS); 175 return SOCKET_ERROR; 176 } 177 ret = shutdown(s, how); 178 179 if(ret == SOCKET_ERROR) { 180 WSASetLastError(wsaErrno()); 181 } 182 else WSASetLastError(NO_ERROR); 183 return ret; 184 } 185 //****************************************************************************** 186 //****************************************************************************** 187 ODINFUNCTION3(SOCKET,OS2socket, 188 int,af, 189 int,type, 190 int,protocol) 191 { 192 SOCKET s; 193 194 if(!fWSAInitialized) { 195 WSASetLastError(WSANOTINITIALISED); 196 return SOCKET_ERROR; 197 } 198 else 199 if(WSAIsBlocking()) { 200 WSASetLastError(WSAEINPROGRESS); 201 return SOCKET_ERROR; 202 } 203 s = socket(af, type, protocol); 204 205 if(s == SOCKET_ERROR && sock_errno() == SOCEPFNOSUPPORT) { 206 //map SOCEPFNOSUPPORT to SOCEPFNOSUPPORT 207 WSASetLastError(SOCEPFNOSUPPORT); 208 } 209 else 210 if(s == SOCKET_ERROR) { 211 WSASetLastError(wsaErrno()); 212 } 213 else WSASetLastError(NO_ERROR); 214 return s; 215 } 216 //****************************************************************************** 217 //****************************************************************************** 218 219 220 /***************************************************************************** 221 * Name : 222 * Purpose : 223 * Parameters: 224 * Variables : 225 * Result : 226 * Remark : 227 * Status : UNTESTED STUB 228 * 229 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 230 *****************************************************************************/ 231 232 ODINFUNCTION0(int,OS2WSAGetLastError) 233 { 234 // according to the docs, WSASetLastError() is just a call-through 235 // to SetLastError(). However, what can be implemented here? 236 return WSAGetLastError(); 237 } 238 239 240 /***************************************************************************** 241 * Name : 242 * Purpose : 243 * Parameters: 244 * Variables : 245 * Result : 246 * Remark : 247 * Status : UNTESTED STUB 248 * 249 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 250 *****************************************************************************/ 251 252 ODINFUNCTION2(int,OS2__WSAFDIsSet,SOCKET, s, 253 fd_set*,fds) 254 { 255 return (__WSAFDIsSet(s,fds)); 256 } 257 258 259 /***************************************************************************** 260 * Name : 261 * Purpose : 262 * Parameters: 263 * Variables : 264 * Result : 265 * Remark : 266 * Status : UNTESTED STUB 267 * 268 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 269 *****************************************************************************/ 270 271 ODINFUNCTION3(SOCKET,OS2accept, SOCKET, s, 272 struct sockaddr *,addr, 273 int *, addrlen) 274 { 275 return(accept(s,addr,addrlen)); 276 } 277 278 279 /***************************************************************************** 280 * Name : 281 * Purpose : 282 * Parameters: 283 * Variables : 284 * Result : 285 * Remark : 286 * Status : UNTESTED STUB 287 * 288 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 289 *****************************************************************************/ 290 291 ODINFUNCTION3(int,OS2bind, 292 SOCKET ,s, 293 const struct sockaddr *,addr, 294 int, namelen) 295 { 296 return(bind(s,addr,namelen)); 297 } 298 299 300 /***************************************************************************** 301 * Name : 302 * Purpose : 303 * Parameters: 304 * Variables : 305 * Result : 306 * Remark : 307 * Status : UNTESTED STUB 308 * 309 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 310 *****************************************************************************/ 311 218 312 ODINFUNCTION1(int,OS2closesocket,SOCKET, s) 219 313 { 220 int ret; 221 222 if(!fWSAInitialized) { 223 WSASetLastError(WSANOTINITIALISED); 224 return SOCKET_ERROR; 225 } 226 else 227 if(WSAIsBlocking()) { 228 WSASetLastError(WSAEINPROGRESS); 229 return SOCKET_ERROR; 230 } 231 ret = soclose(s); 232 233 //Close WSAAsyncSelect thread if one was created for this socket 234 EnableAsyncEvent(s, 0L); 235 236 if(ret == SOCKET_ERROR) { 237 WSASetLastError(wsaErrno()); 238 } 239 else WSASetLastError(NO_ERROR); 240 return ret; 241 } 242 //****************************************************************************** 243 //****************************************************************************** 314 return(closesocket(s)); 315 } 316 317 318 /***************************************************************************** 319 * Name : 320 * Purpose : 321 * Parameters: 322 * Variables : 323 * Result : 324 * Remark : 325 * Status : UNTESTED STUB 326 * 327 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 328 *****************************************************************************/ 329 244 330 ODINFUNCTION3(int,OS2connect, 245 331 SOCKET, s, … … 247 333 int, namelen) 248 334 { 249 int ret; 250 251 if(!fWSAInitialized) { 252 WSASetLastError(WSANOTINITIALISED); 253 return SOCKET_ERROR; 254 } 255 else 256 if(WSAIsBlocking()) { 257 WSASetLastError(WSAEINPROGRESS); 258 return SOCKET_ERROR; 259 } 260 ret = connect(s, (sockaddr *)name, namelen); 261 // map BSD error codes 262 if(ret == SOCKET_ERROR) { 263 if(sock_errno() == SOCEINPROGRESS) { 264 WSASetLastError(WSAEWOULDBLOCK); 265 } 266 else 267 if (sock_errno() == SOCEOPNOTSUPP) { 268 WSASetLastError(WSAEINVAL); 269 } 270 else WSASetLastError(wsaErrno()); 271 } 272 else WSASetLastError(NO_ERROR); 273 return ret; 274 } 275 //****************************************************************************** 276 //****************************************************************************** 335 return(connect(s,name,namelen)); 336 } 337 338 339 /***************************************************************************** 340 * Name : 341 * Purpose : 342 * Parameters: 343 * Variables : 344 * Result : 345 * Remark : 346 * Status : UNTESTED STUB 347 * 348 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 349 *****************************************************************************/ 350 277 351 ODINFUNCTION3(int,OS2ioctlsocket, 278 352 SOCKET,s, … … 280 354 u_long *,argp) 281 355 { 282 int ret; 283 284 if(!fWSAInitialized) { 285 WSASetLastError(WSANOTINITIALISED); 286 return SOCKET_ERROR; 287 } 288 else 289 if(WSAIsBlocking()) { 290 WSASetLastError(WSAEINPROGRESS); 291 return SOCKET_ERROR; 292 } 293 if(cmd != FIONBIO && cmd != FIONREAD && cmd != SIOCATMARK) { 294 WSASetLastError(WSAEINVAL); 295 return SOCKET_ERROR; 296 } 297 298 WSASetLastError(NO_ERROR); 299 300 //check if app want to set a socket, which has an outstanding async select, 301 //to blocking mode 302 if (cmd == FIONBIO) { 303 HWND hwnd; 304 int msg; 305 ULONG lEvent; 306 307 if(QueryAsyncEvent(s, &hwnd, &msg, &lEvent) == TRUE) { 308 if(*argp != 0) { 309 //nothing to do; already non-blocking 310 return NO_ERROR; 311 } 312 else { 313 dprintf(("Trying to set socket to blocking mode while async select active -> return error!")); 314 WSASetLastError(WSAEINVAL); 315 return SOCKET_ERROR; 316 } 317 } 318 } 319 // clear high word (not used in OS/2's tcpip stack) 320 ret = ioctl(s, LOUSHORT(cmd), (char *)argp, sizeof(int)); 321 322 // Map EOPNOTSUPP to EINVAL 323 if(ret == SOCKET_ERROR && sock_errno() == SOCEOPNOTSUPP) 324 WSASetLastError(WSAEINVAL); 325 else 326 if(ret == SOCKET_ERROR) { 327 WSASetLastError(wsaErrno()); 328 } 329 else WSASetLastError(NO_ERROR); 330 return ret; 331 } 332 //****************************************************************************** 333 //****************************************************************************** 356 return(ioctlsocket(s,cmd,argp)); 357 } 358 359 360 /***************************************************************************** 361 * Name : 362 * Purpose : 363 * Parameters: 364 * Variables : 365 * Result : 366 * Remark : 367 * Status : UNTESTED STUB 368 * 369 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 370 *****************************************************************************/ 371 334 372 ODINFUNCTION3(int,OS2getpeername, 335 373 SOCKET, s, … … 337 375 int *, namelen) 338 376 { 339 int ret; 340 341 if(!fWSAInitialized) { 342 WSASetLastError(WSANOTINITIALISED); 343 return SOCKET_ERROR; 344 } 345 else 346 if(WSAIsBlocking()) { 347 WSASetLastError(WSAEINPROGRESS); 348 return SOCKET_ERROR; 349 } 350 else 351 if (namelen == NULL || *namelen < (int)sizeof(struct sockaddr_in)) { 352 WSASetLastError(WSAEFAULT); 353 return SOCKET_ERROR; 354 } 355 ret = getsockname(s, name, namelen); 356 if(ret == SOCKET_ERROR) { 357 WSASetLastError(wsaErrno()); 358 } 359 else WSASetLastError(NO_ERROR); 360 return ret; 361 } 362 //****************************************************************************** 363 //****************************************************************************** 377 return(getpeername(s,name,namelen)); 378 } 379 380 381 /***************************************************************************** 382 * Name : 383 * Purpose : 384 * Parameters: 385 * Variables : 386 * Result : 387 * Remark : 388 * Status : UNTESTED STUB 389 * 390 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 391 *****************************************************************************/ 392 364 393 ODINFUNCTION3(int,OS2getsockname, 365 394 SOCKET,s, … … 367 396 int *, namelen) 368 397 { 369 int ret; 370 371 if(!fWSAInitialized) { 372 WSASetLastError(WSANOTINITIALISED); 373 return SOCKET_ERROR; 374 } 375 else 376 if(WSAIsBlocking()) { 377 WSASetLastError(WSAEINPROGRESS); 378 return SOCKET_ERROR; 379 } 380 else 381 if (namelen == NULL || *namelen < (int)sizeof(struct sockaddr_in)) { 382 WSASetLastError(WSAEFAULT); 383 return SOCKET_ERROR; 384 } 385 ret = getsockname(s, name, namelen); 386 if(ret == SOCKET_ERROR) { 387 WSASetLastError(wsaErrno()); 388 } 389 else WSASetLastError(NO_ERROR); 390 return ret; 391 } 392 //****************************************************************************** 393 //****************************************************************************** 398 return(getsockname(s,name,namelen)); 399 } 400 401 402 /***************************************************************************** 403 * Name : 404 * Purpose : 405 * Parameters: 406 * Variables : 407 * Result : 408 * Remark : 409 * Status : UNTESTED STUB 410 * 411 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 412 *****************************************************************************/ 413 414 ODINFUNCTION5(int,OS2getsockopt, 415 SOCKET, s, 416 int, level, 417 int, optname, 418 char *, optval, 419 int *,optlen) 420 { 421 return(getsockopt(s, 422 level, 423 optname, 424 optval, 425 optlen)); 426 } 427 428 429 /***************************************************************************** 430 * Name : 431 * Purpose : 432 * Parameters: 433 * Variables : 434 * Result : 435 * Remark : 436 * Status : UNTESTED STUB 437 * 438 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 439 *****************************************************************************/ 440 394 441 ODINFUNCTION1(u_long,OS2htonl, 395 442 u_long,hostlong) … … 397 444 return(htonl(hostlong)); 398 445 } 399 //****************************************************************************** 400 //****************************************************************************** 446 447 448 /***************************************************************************** 449 * Name : 450 * Purpose : 451 * Parameters: 452 * Variables : 453 * Result : 454 * Remark : 455 * Status : UNTESTED STUB 456 * 457 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 458 *****************************************************************************/ 459 401 460 ODINFUNCTION1(u_short,OS2htons, 402 461 u_short,hostshort) … … 404 463 return(htons(hostshort)); 405 464 } 406 //****************************************************************************** 407 //****************************************************************************** 408 ODINFUNCTION1(u_long,OS2ntohl, 409 u_long,netlong) 410 { 411 return(ntohl(netlong)); 412 } 413 //****************************************************************************** 414 //****************************************************************************** 415 ODINFUNCTION1(u_short,OS2ntohs, 416 u_short,netshort) 417 { 418 return(ntohs(netshort)); 419 } 420 //****************************************************************************** 421 //****************************************************************************** 465 466 467 /***************************************************************************** 468 * Name : 469 * Purpose : 470 * Parameters: 471 * Variables : 472 * Result : 473 * Remark : 474 * Status : UNTESTED STUB 475 * 476 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 477 *****************************************************************************/ 478 422 479 ODINFUNCTION1(unsigned long,OS2inet_addr, 423 480 const char *, cp) … … 426 483 cp)); 427 484 428 return (inet_addr((char *)cp)); 429 } 430 //****************************************************************************** 431 //****************************************************************************** 485 return (inet_addr(cp)); 486 } 487 488 489 /***************************************************************************** 490 * Name : 491 * Purpose : 492 * Parameters: 493 * Variables : 494 * Result : 495 * Remark : 496 * Status : UNTESTED STUB 497 * 498 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 499 *****************************************************************************/ 500 432 501 ODINFUNCTION1(char *,OS2inet_ntoa, 433 502 struct in_addr, in) … … 435 504 return(inet_ntoa(in)); 436 505 } 437 //****************************************************************************** 438 //****************************************************************************** 439 ODINFUNCTION3(SOCKET,OS2accept, SOCKET, s, 440 struct sockaddr *,addr, 441 int *, addrlen) 442 { 443 int ret, msg; 444 HWND hwnd; 445 ULONG lEvent; 446 447 if(!fWSAInitialized) { 448 WSASetLastError(WSANOTINITIALISED); 449 return SOCKET_ERROR; 450 } 451 else 452 if(WSAIsBlocking()) { 453 WSASetLastError(WSAEINPROGRESS); 454 return SOCKET_ERROR; 455 } 456 else 457 if ((addr != NULL) && (addrlen != NULL)) { 458 if (*addrlen < (int)sizeof(struct sockaddr_in)) { 459 WSASetLastError(WSAEFAULT); 460 return SOCKET_ERROR; 461 } 462 } 463 ret = accept(s, addr, addrlen); 464 465 if(ret != SOCKET_ERROR) { 466 //Enable FD_ACCEPT event flag if WSAAsyncSelect was called for this socket 467 EnableAsyncEvent(s, FD_ACCEPT); 468 469 //if this socket has an active async. select pending, then call WSAAsyncSelect 470 //with the same parameters for the new socket (see docs) 471 if(QueryAsyncEvent(s, &hwnd, &msg, &lEvent) == TRUE) { 472 if(WSAAsyncSelect(ret, hwnd, msg, lEvent) == SOCKET_ERROR) { 473 ret = SOCKET_ERROR; 474 } 475 } 476 } 477 if(ret == SOCKET_ERROR) { 478 WSASetLastError(wsaErrno()); 479 } 480 else WSASetLastError(NO_ERROR); 481 return ret; 482 } 483 //****************************************************************************** 484 //****************************************************************************** 485 ODINFUNCTION3(int,OS2bind, 486 SOCKET ,s, 487 const struct sockaddr *,addr, 488 int, namelen) 489 { 490 int ret; 491 492 if(!fWSAInitialized) { 493 WSASetLastError(WSANOTINITIALISED); 494 return SOCKET_ERROR; 495 } 496 else 497 if(WSAIsBlocking()) { 498 WSASetLastError(WSAEINPROGRESS); 499 return SOCKET_ERROR; 500 } 501 else 502 if(namelen < (int)sizeof(struct sockaddr_in)) { 503 WSASetLastError(WSAEFAULT); 504 return SOCKET_ERROR; 505 } 506 ret = bind(s, (struct sockaddr *)addr, namelen); 507 508 if(ret == SOCKET_ERROR) { 509 WSASetLastError(wsaErrno()); 510 } 511 else WSASetLastError(NO_ERROR); 512 return ret; 513 } 514 //****************************************************************************** 515 //****************************************************************************** 506 507 508 /***************************************************************************** 509 * Name : 510 * Purpose : 511 * Parameters: 512 * Variables : 513 * Result : 514 * Remark : 515 * Status : UNTESTED STUB 516 * 517 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 518 *****************************************************************************/ 519 516 520 ODINFUNCTION2(int,OS2listen, 517 521 SOCKET, s, 518 522 int, backlog) 519 523 { 520 int ret, tmp, namelen; 521 struct sockaddr_in name; 522 523 if(!fWSAInitialized) { 524 WSASetLastError(WSANOTINITIALISED); 525 return SOCKET_ERROR; 526 } 527 else 528 if(WSAIsBlocking()) { 529 WSASetLastError(WSAEINPROGRESS); 530 return SOCKET_ERROR; 531 } 532 namelen = sizeof(name); 533 ret = getsockname(s, (struct sockaddr *)&name, &namelen); 534 if (ret == 0) { 535 if (name.sin_port == 0 && name.sin_addr.s_addr == 0) { 536 // Socket is not bound 537 WSASetLastError(WSAEINVAL); 538 return SOCKET_ERROR; 539 } 540 ret = ioctl(s, FIOBSTATUS, (char *)&tmp, sizeof(tmp)) & 541 (SS_ISCONNECTING | SS_ISCONNECTED | SS_ISDISCONNECTING); 542 if(ret) { 543 // Socket is already connected 544 WSASetLastError(WSAEISCONN); 545 return SOCKET_ERROR; 546 } 547 ret = listen(s, backlog); 548 //todo: reset FD_ACCEPT bit? (wine seems to do this, but it's not documented) 549 } 550 if(ret == SOCKET_ERROR) { 551 WSASetLastError(wsaErrno()); 552 } 553 else WSASetLastError(NO_ERROR); 554 return ret; 555 } 556 //****************************************************************************** 557 //****************************************************************************** 524 return(listen(s,backlog)); 525 } 526 527 528 /***************************************************************************** 529 * Name : 530 * Purpose : 531 * Parameters: 532 * Variables : 533 * Result : 534 * Remark : 535 * Status : UNTESTED STUB 536 * 537 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 538 *****************************************************************************/ 539 540 ODINFUNCTION1(u_long,OS2ntohl, 541 u_long,netlong) 542 { 543 return(ntohl(netlong)); 544 } 545 546 547 /***************************************************************************** 548 * Name : 549 * Purpose : 550 * Parameters: 551 * Variables : 552 * Result : 553 * Remark : 554 * Status : UNTESTED STUB 555 * 556 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 557 *****************************************************************************/ 558 559 ODINFUNCTION1(u_short,OS2ntohs, 560 u_short,netshort) 561 { 562 return(ntohs(netshort)); 563 } 564 565 566 /***************************************************************************** 567 * Name : 568 * Purpose : 569 * Parameters: 570 * Variables : 571 * Result : 572 * Remark : 573 * Status : UNTESTED STUB 574 * 575 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 576 *****************************************************************************/ 577 558 578 ODINFUNCTION4(int,OS2recv, 559 579 SOCKET,s, … … 562 582 int,flags) 563 583 { 564 int ret; 565 566 if(!fWSAInitialized) { 567 WSASetLastError(WSANOTINITIALISED); 568 return SOCKET_ERROR; 569 } 570 else 571 if(WSAIsBlocking()) { 572 WSASetLastError(WSAEINPROGRESS); 573 return SOCKET_ERROR; 574 } 575 ret = recv(s, buf, len, flags); 576 577 if(ret == SOCKET_ERROR) { 578 WSASetLastError(wsaErrno()); 579 } 580 else WSASetLastError(NO_ERROR); 581 582 //Reset FD_READ event flagfor WSAAsyncSelect thread if one was created for this socket 583 EnableAsyncEvent(s, FD_READ); 584 return ret; 585 } 586 //****************************************************************************** 587 //****************************************************************************** 584 return(recv(s, 585 buf, 586 len, 587 flags)); 588 } 589 590 591 /***************************************************************************** 592 * Name : 593 * Purpose : 594 * Parameters: 595 * Variables : 596 * Result : 597 * Remark : 598 * Status : UNTESTED STUB 599 * 600 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 601 *****************************************************************************/ 602 588 603 ODINFUNCTION6(int,OS2recvfrom, 589 604 SOCKET,s, … … 594 609 int *,fromlen) 595 610 { 596 int ret; 597 598 if(!fWSAInitialized) { 599 WSASetLastError(WSANOTINITIALISED); 600 return SOCKET_ERROR; 601 } 602 else 603 if(WSAIsBlocking()) { 604 WSASetLastError(WSAEINPROGRESS); 605 return SOCKET_ERROR; 606 } 607 else 608 if(fromlen == NULL || *fromlen < (int)sizeof(struct sockaddr_in)) { 609 WSASetLastError(WSAEFAULT); 610 return SOCKET_ERROR; 611 } 612 ret = recvfrom(s, buf, len, flags, from, fromlen); 613 614 if(ret == SOCKET_ERROR) { 615 WSASetLastError(wsaErrno()); 616 } 617 else WSASetLastError(NO_ERROR); 618 619 //Reset FD_READ event flagfor WSAAsyncSelect thread if one was created for this socket 620 EnableAsyncEvent(s, FD_READ); 621 return ret; 622 } 623 //****************************************************************************** 624 //****************************************************************************** 611 612 return(recvfrom(s, 613 buf, 614 len, 615 flags, 616 from, 617 fromlen)); 618 } 619 620 621 /***************************************************************************** 622 * Name : 623 * Purpose : 624 * Parameters: 625 * Variables : 626 * Result : 627 * Remark : 628 * Status : UNTESTED STUB 629 * 630 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 631 *****************************************************************************/ 632 633 ODINFUNCTION5(int,OS2select, 634 int,nfds, 635 fd_set *,readfds, 636 fd_set *,writefds, 637 fd_set *,exceptfds, 638 const struct timeval *,timeout) 639 { 640 return(select(nfds, 641 readfds, 642 writefds, 643 exceptfds, 644 timeout)); 645 } 646 647 648 /***************************************************************************** 649 * Name : 650 * Purpose : 651 * Parameters: 652 * Variables : 653 * Result : 654 * Remark : 655 * Status : UNTESTED STUB 656 * 657 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 658 *****************************************************************************/ 659 625 660 ODINFUNCTION4(int,OS2send, 626 661 SOCKET,s, … … 629 664 int,flags) 630 665 { 631 int ret; 632 633 if(!fWSAInitialized) { 634 WSASetLastError(WSANOTINITIALISED); 635 return SOCKET_ERROR; 636 } 637 else 638 if(WSAIsBlocking()) { 639 WSASetLastError(WSAEINPROGRESS); 640 return SOCKET_ERROR; 641 } 642 ret = send(s, (char *)buf, len, flags); 643 644 if(ret == SOCKET_ERROR) { 645 WSASetLastError(wsaErrno()); 646 } 647 else WSASetLastError(NO_ERROR); 648 649 //Reset FD_WRITE event flagfor WSAAsyncSelect thread if one was created for this socket 650 EnableAsyncEvent(s, FD_WRITE); 651 return ret; 652 } 653 //****************************************************************************** 654 //****************************************************************************** 666 return(send(s, 667 buf, 668 len, 669 flags)); 670 } 671 672 673 /***************************************************************************** 674 * Name : 675 * Purpose : 676 * Parameters: 677 * Variables : 678 * Result : 679 * Remark : 680 * Status : UNTESTED STUB 681 * 682 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 683 *****************************************************************************/ 684 655 685 ODINFUNCTION6(int,OS2sendto, 656 686 SOCKET,s, … … 661 691 int,tolen) 662 692 { 663 int ret; 664 665 if(!fWSAInitialized) { 666 WSASetLastError(WSANOTINITIALISED); 667 return SOCKET_ERROR; 668 } 669 else 670 if(WSAIsBlocking()) { 671 WSASetLastError(WSAEINPROGRESS); 672 return SOCKET_ERROR; 673 } 674 else 675 if(tolen < (int)sizeof(struct sockaddr_in)) { 676 WSASetLastError(WSAEFAULT); 677 return SOCKET_ERROR; 678 } 679 ret = sendto(s, (char *)buf, len, flags, (struct sockaddr *)to, tolen); 680 681 if(ret == SOCKET_ERROR) { 682 WSASetLastError(wsaErrno()); 683 } 684 else WSASetLastError(NO_ERROR); 685 686 //Reset FD_WRITE event flagfor WSAAsyncSelect thread if one was created for this socket 687 EnableAsyncEvent(s, FD_WRITE); 688 return ret; 689 } 690 //****************************************************************************** 691 //****************************************************************************** 692 ODINFUNCTION5(int,OS2select, 693 int,nfds, 694 ws_fd_set *,readfds, 695 ws_fd_set *,writefds, 696 ws_fd_set *,exceptfds, 697 const struct timeval *,timeout) 698 { 699 int ret, i, j; 700 int *sockets, *socktmp; 701 int nrread, nrwrite, nrexcept; 702 ULONG ttimeout; 703 704 WSASetLastError(NO_ERROR); 705 706 if(!fWSAInitialized) { 707 WSASetLastError(WSANOTINITIALISED); 708 return SOCKET_ERROR; 709 } 710 else 711 if(WSAIsBlocking()) { 712 WSASetLastError(WSAEINPROGRESS); 713 return SOCKET_ERROR; 714 } 715 else { 716 nrread = nrwrite = nrexcept = 0; 717 if(readfds) { 718 nrread += readfds->fd_count; 719 } 720 if(writefds) { 721 nrwrite += writefds->fd_count; 722 } 723 if(exceptfds) { 724 nrexcept += exceptfds->fd_count; 725 } 726 if(nrread + nrwrite + nrexcept == 0) { 727 WSASetLastError(WSAEINVAL); 728 return SOCKET_ERROR; 729 } 730 if(timeout != NULL && (timeout->tv_sec < 0 || timeout->tv_usec < 0)) { 731 WSASetLastError(WSAEINVAL); 732 return SOCKET_ERROR; 733 } 734 if(timeout == NULL) { 735 ttimeout = -1L; // no timeout 736 } 737 else ttimeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; 738 739 sockets = (int *)malloc(sizeof(int) * (nrread+nrwrite+nrexcept)); 740 if(readfds) { 741 memcpy(&sockets[0], readfds->fd_array, nrread * sizeof(SOCKET)); 742 } 743 if(writefds) { 744 memcpy(&sockets[nrread], writefds->fd_array, nrwrite * sizeof(SOCKET)); 745 } 746 if(exceptfds) { 747 memcpy(&sockets[nrread+nrwrite], exceptfds->fd_array, nrexcept * sizeof(SOCKET)); 748 } 749 750 ret = select(sockets, nrread, nrwrite, nrexcept, ttimeout); 751 752 if(ret == SOCKET_ERROR) 753 { 754 if(readfds != NULL) 755 readfds->fd_count = 0; 756 757 if(writefds != NULL) 758 writefds->fd_count = 0; 759 760 if(exceptfds != NULL) 761 exceptfds->fd_count = 0; 762 763 WSASetLastError(wsaErrno()); 764 free(sockets); 765 return SOCKET_ERROR; 766 } 767 768 if(ret != 0) { 769 socktmp = sockets; 770 if(readfds != NULL) { 771 for(i=0;i<nrread;i++) { 772 if(socktmp[i] != -1) { 773 readfds->fd_array[j] = socktmp[i]; 774 } 775 } 776 readfds->fd_count = i; 777 socktmp += nrread; 778 } 779 780 if(writefds != NULL) { 781 for(i=0;i<nrwrite;i++) { 782 if(socktmp[i] != -1) { 783 writefds->fd_array[j] = socktmp[i]; 784 } 785 } 786 writefds->fd_count = i; 787 socktmp += nrwrite; 788 } 789 if(exceptfds != NULL) { 790 for(i=0;i<nrexcept;i++) { 791 if(socktmp[i] != -1) { 792 exceptfds->fd_array[j] = socktmp[i]; 793 } 794 } 795 exceptfds->fd_count = i; 796 } 797 } 798 else { 799 if(readfds != NULL) 800 readfds->fd_count = 0; 801 802 if(writefds != NULL) 803 writefds->fd_count = 0; 804 805 if(exceptfds != NULL) 806 exceptfds->fd_count = 0; 807 } 808 free(sockets); 809 } 810 return ret; 811 } 812 //****************************************************************************** 813 //****************************************************************************** 693 return(sendto(s, 694 buf, 695 len, 696 flags, 697 to, 698 tolen)); 699 } 700 701 702 /***************************************************************************** 703 * Name : 704 * Purpose : 705 * Parameters: 706 * Variables : 707 * Result : 708 * Remark : 709 * Status : UNTESTED STUB 710 * 711 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 712 *****************************************************************************/ 713 814 714 ODINFUNCTION5(int,OS2setsockopt, 815 715 SOCKET,s, … … 819 719 int,optlen) 820 720 { 821 struct ws_linger *yy; 822 struct linger xx; 823 int ret; 824 ULONG size; 825 826 if(!fWSAInitialized) { 827 WSASetLastError(WSANOTINITIALISED); 828 return SOCKET_ERROR; 829 } 830 else 831 if(WSAIsBlocking()) { 832 WSASetLastError(WSAEINPROGRESS); 833 return SOCKET_ERROR; 834 } 835 if (level == SOL_SOCKET) { 836 switch(optname) { 837 case SO_DONTLINGER: 838 case SO_LINGER: 839 if(optlen < (int)sizeof(ws_linger)) { 840 WSASetLastError(WSAEFAULT); 841 return SOCKET_ERROR; 842 } 843 yy = (struct ws_linger *)optval; 844 xx.l_onoff = (optname == SO_DONTLINGER) ? !yy->l_onoff : yy->l_onoff; 845 xx.l_linger = yy->l_linger; 846 847 ret = setsockopt(s,level,optname,(char *)&xx, sizeof(xx)); 848 break; 849 case SO_SNDBUF: 850 case SO_RCVBUF: 851 if(optlen < (int)sizeof(int)) { 852 WSASetLastError(WSAEFAULT); 853 return SOCKET_ERROR; 854 } 855 856 size = *(ULONG *)optval; 721 struct Wlinger *yy; 722 struct linger xx; 723 int rc; 724 725 if(level == SOL_SOCKET && 726 optname == SO_LINGER) 727 { 728 yy = (struct Wlinger *)optval; 729 xx.l_onoff = (int)yy->l_onoff; 730 xx.l_linger = (int)yy->l_linger; 731 732 rc = setsockopt(s,level,optname,(char *)&xx, sizeof(xx)); 733 } 734 else 735 if(level == SOL_SOCKET && (optname == SO_SNDBUF || optname == SO_RCVBUF)) { 736 ULONG size; 737 738 size = *(ULONG *)optval; 857 739 tryagain: 858 ret = setsockopt(s,level,optname, (char *)&size, sizeof(ULONG)); 859 if(ret == SOCKET_ERROR && size > 65535) { 860 //SvL: Limit send & receive buffer length to 64k 861 // (only happens with 16 bits tcpip stack?) 862 size = 65000; 863 goto tryagain; 864 } 865 break; 866 867 case SO_BROADCAST: 868 case SO_DEBUG: 869 case SO_KEEPALIVE: 870 case SO_DONTROUTE: 871 case SO_OOBINLINE: 872 case SO_REUSEADDR: 873 if(optlen < (int)sizeof(int)) { 874 WSASetLastError(WSAEFAULT); 875 return SOCKET_ERROR; 876 } 877 ret = setsockopt(s, level, optname, (char *)optval, optlen); 878 break; 879 default: 880 WSASetLastError(WSAENOPROTOOPT); 881 return SOCKET_ERROR; 882 } 883 } 884 else 885 if(level == IPPROTO_TCP) { 886 if(optname == TCP_NODELAY) { 887 if(optlen < (int)sizeof(int)) { 888 WSASetLastError(WSAEFAULT); 889 return SOCKET_ERROR; 890 } 891 ret = setsockopt(s, level, optname, (char *)optval, optlen); 892 } 893 else { 894 WSASetLastError(WSAENOPROTOOPT); 895 return SOCKET_ERROR; 896 } 897 } 898 else { 899 WSASetLastError(WSAEINVAL); 900 return SOCKET_ERROR; 901 } 902 903 if(ret == SOCKET_ERROR) { 904 WSASetLastError(wsaErrno()); 905 } 906 else WSASetLastError(NO_ERROR); 907 return ret; 908 } 909 //****************************************************************************** 910 //****************************************************************************** 911 ODINFUNCTION5(int,OS2getsockopt, 912 SOCKET, s, 913 int, level, 914 int, optname, 915 char *, optval, 916 int *,optlen) 917 { 918 struct ws_linger *yy; 919 struct linger xx; 920 int ret; 921 int size, options; 922 923 if(!fWSAInitialized) { 924 WSASetLastError(WSANOTINITIALISED); 925 return SOCKET_ERROR; 926 } 927 else 928 if(WSAIsBlocking()) { 929 WSASetLastError(WSAEINPROGRESS); 930 return SOCKET_ERROR; 931 } 932 if (level == SOL_SOCKET) { 933 switch(optname) { 934 case SO_DONTLINGER: 935 case SO_LINGER: 936 if(optlen == NULL || *optlen < sizeof(ws_linger)) { 937 WSASetLastError(WSAEFAULT); 938 return SOCKET_ERROR; 939 } 940 size = sizeof(xx); 941 ret = getsockopt(s,level,optname,(char *)&xx, &size); 942 yy = (struct ws_linger *)optval; 943 yy->l_onoff = (optname == SO_DONTLINGER) ? !xx.l_onoff : xx.l_onoff; 944 yy->l_linger = xx.l_linger; 945 *optlen = size; 946 break; 947 948 case SO_SNDBUF: 949 case SO_RCVBUF: 950 case SO_BROADCAST: 951 case SO_DEBUG: 952 case SO_KEEPALIVE: 953 case SO_DONTROUTE: 954 case SO_OOBINLINE: 955 case SO_REUSEADDR: 956 case SO_TYPE: 957 if(optlen == NULL || *optlen < sizeof(int)) { 958 WSASetLastError(WSAEFAULT); 959 return SOCKET_ERROR; 960 } 961 ret = getsockopt(s, level, optname, (char *)optval, optlen); 962 break; 963 case SO_ACCEPTCONN: 964 if(optlen == NULL || *optlen < sizeof(int)) { 965 WSASetLastError(WSAEFAULT); 966 return SOCKET_ERROR; 967 } 968 size = sizeof(options); 969 ret = getsockopt(s, SOL_SOCKET, SO_OPTIONS, (char *)&options, &size); 970 if(ret != SOCKET_ERROR) { 971 *(BOOL *)optval = (options & SO_ACCEPTCONN) == SO_ACCEPTCONN; 972 *optlen = sizeof(BOOL); 973 } 974 break; 975 default: 976 WSASetLastError(WSAENOPROTOOPT); 977 return SOCKET_ERROR; 978 } 979 } 980 else 981 if(level == IPPROTO_TCP) { 982 if(optname == TCP_NODELAY) { 983 if(optlen == NULL || *optlen < sizeof(int)) { 984 WSASetLastError(WSAEFAULT); 985 return SOCKET_ERROR; 986 } 987 ret = getsockopt(s, level, optname, (char *)optval, optlen); 988 } 989 else { 990 WSASetLastError(WSAENOPROTOOPT); 991 return SOCKET_ERROR; 992 } 993 } 994 else { 995 WSASetLastError(WSAEINVAL); 996 return SOCKET_ERROR; 997 } 998 999 if(ret == SOCKET_ERROR) { 1000 WSASetLastError(wsaErrno()); 1001 } 1002 else WSASetLastError(NO_ERROR); 1003 return ret; 1004 } 1005 //****************************************************************************** 1006 //****************************************************************************** 740 rc = setsockopt(s,level,optname, (char *)&size, sizeof(ULONG)); 741 if(rc == SOCKET_ERROR && size > 65535) { 742 //SvL: Limit send & receive buffer length to 64k 743 // (only happens with 16 bits tcpip stack?) 744 size = 65000; 745 goto tryagain; 746 } 747 748 } 749 else { 750 rc = setsockopt(s,level,optname,(char *)optval,optlen); 751 } 752 753 if (rc == SOCKET_ERROR) 754 //OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno())); 755 OS2WSASetLastError(WSAEINVAL); 756 else 757 OS2WSASetLastError(ERROR_SUCCESS); 758 759 return rc; 760 } 761 762 763 /***************************************************************************** 764 * Name : 765 * Purpose : 766 * Parameters: 767 * Variables : 768 * Result : 769 * Remark : 770 * Status : UNTESTED STUB 771 * 772 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 773 *****************************************************************************/ 774 775 ODINFUNCTION2(int,OS2shutdown, 776 SOCKET,s, 777 int,how) 778 { 779 return(shutdown(s, 780 how)); 781 } 782 783 784 /***************************************************************************** 785 * Name : 786 * Purpose : 787 * Parameters: 788 * Variables : 789 * Result : 790 * Remark : 791 * Status : UNTESTED STUB 792 * 793 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 794 *****************************************************************************/ 795 796 ODINFUNCTION3(SOCKET,OS2socket, 797 int,af, 798 int,type, 799 int,protocol) 800 { 801 return(socket(af, 802 type, 803 protocol)); 804 } 805 806 1007 807 /* Database function prototypes */ 1008 //****************************************************************************** 1009 //****************************************************************************** 808 809 /***************************************************************************** 810 * Name : 811 * Purpose : 812 * Parameters: 813 * Variables : 814 * Result : 815 * Remark : 816 * Status : UNTESTED STUB 817 * 818 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 819 *****************************************************************************/ 820 821 ODINFUNCTION3(struct Whostent *,OS2gethostbyaddr, 822 const char *,addr, 823 int,len, 824 int,type) 825 { 826 WHOSTENT *yy; 827 struct hostent *xx; 828 PWSOCKTHREADDATA pwstd; 829 830 xx = gethostbyaddr((char *)addr,len,type); 831 //PH: we assume PMWSOCK sets WSASetLastError correctly! 832 833 if(xx == NULL) 834 return (WHOSTENT *)NULL; 835 836 // access current thread wsock data block 837 pwstd = iQueryWsockThreadData(); 838 839 pwstd->whsnt.h_name = xx->h_name; 840 pwstd->whsnt.h_aliases = xx->h_aliases; 841 pwstd->whsnt.h_addrtype = (short)xx->h_addrtype; 842 pwstd->whsnt.h_length = (short)xx->h_length; 843 pwstd->whsnt.h_addr_list = xx->h_addr_list; 844 845 return &pwstd->whsnt; 846 } 847 848 849 /***************************************************************************** 850 * Name : 851 * Purpose : 852 * Parameters: 853 * Variables : 854 * Result : 855 * Remark : 856 * Status : UNTESTED STUB 857 * 858 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 859 *****************************************************************************/ 860 861 ODINFUNCTION1(struct Whostent *,OS2gethostbyname, 862 const char *,name) 863 { 864 WHOSTENT *yy; 865 struct hostent *xx; 866 PWSOCKTHREADDATA pwstd; 867 868 869 xx = gethostbyname((char *)name); 870 //PH: we assume PMWSOCK sets WSASetLastError correctly! 871 872 if(xx == NULL) 873 return (WHOSTENT *)NULL; 874 875 // access current thread wsock data block 876 pwstd = iQueryWsockThreadData(); 877 878 pwstd->whsnt.h_name = xx->h_name; 879 pwstd->whsnt.h_aliases = xx->h_aliases; 880 pwstd->whsnt.h_addrtype = (short)xx->h_addrtype; 881 pwstd->whsnt.h_length = (short)xx->h_length; 882 pwstd->whsnt.h_addr_list = xx->h_addr_list; 883 884 return &pwstd->whsnt; 885 } 886 887 888 /***************************************************************************** 889 * Name : 890 * Purpose : 891 * Parameters: 892 * Variables : 893 * Result : 894 * Remark : 895 * Status : UNTESTED STUB 896 * 897 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 898 *****************************************************************************/ 899 1010 900 ODINFUNCTION2(int,OS2gethostname, 1011 901 char *,name, 1012 902 int,namelen) 1013 903 { 1014 int ret; 1015 1016 ret = gethostname(name, namelen); 1017 if(ret == NULL) { 1018 WSASetLastError(NO_ERROR); 1019 return 0; 1020 } 1021 WSASetLastError((errno == EINVAL) ? WSAEFAULT : wsaErrno()); 1022 return SOCKET_ERROR; 1023 } 1024 //****************************************************************************** 1025 //****************************************************************************** 1026 ODINFUNCTION3(ws_hostent *,OS2gethostbyaddr, 904 //PH: we assume PMWSOCK sets WSASetLastError correctly! 905 return(gethostname(name, 906 namelen)); 907 } 908 909 910 /***************************************************************************** 911 * Name : 912 * Purpose : 913 * Parameters: 914 * Variables : 915 * Result : 916 * Remark : 917 * Status : UNTESTED STUB 918 * 919 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 920 *****************************************************************************/ 921 922 ODINFUNCTION2(struct Wservent *,OS2getservbyport, 923 int, port, 924 const char *, proto) 925 { 926 struct servent *xx; 927 PWSOCKTHREADDATA pwstd; 928 929 //PH: we assume PMWSOCK sets WSASetLastError correctly! 930 xx = getservbyport(port,(char *)proto); 931 932 if(xx == NULL) 933 return (WSERVENT *)NULL; 934 935 // access current thread wsock data block 936 pwstd = iQueryWsockThreadData(); 937 938 pwstd->wsvnt.s_name = xx->s_name; 939 pwstd->wsvnt.s_aliases = xx->s_aliases; 940 pwstd->wsvnt.s_port = (short)xx->s_port; 941 pwstd->wsvnt.s_proto = xx->s_proto; 942 943 return &pwstd->wsvnt; 944 } 945 946 947 /***************************************************************************** 948 * Name : 949 * Purpose : 950 * Parameters: 951 * Variables : 952 * Result : 953 * Remark : 954 * Status : UNTESTED STUB 955 * 956 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 957 *****************************************************************************/ 958 959 ODINFUNCTION2(struct Wservent *,OS2getservbyname, 960 const char *, name, 961 const char *, proto) 962 { 963 WSERVENT *yy; 964 struct servent *xx; 965 PWSOCKTHREADDATA pwstd; 966 967 968 //PH: we assume PMWSOCK sets WSASetLastError correctly! 969 xx = getservbyname((char *)name,(char *)proto); 970 971 if(xx == NULL) 972 return (WSERVENT *)NULL; 973 974 // access current thread wsock data block 975 pwstd = iQueryWsockThreadData(); 976 977 pwstd->wsvnt.s_name = xx->s_name; 978 pwstd->wsvnt.s_aliases = xx->s_aliases; 979 pwstd->wsvnt.s_port = (short)xx->s_port; 980 pwstd->wsvnt.s_proto = xx->s_proto; 981 982 return &pwstd->wsvnt; 983 } 984 985 986 /***************************************************************************** 987 * Name : 988 * Purpose : 989 * Parameters: 990 * Variables : 991 * Result : 992 * Remark : 993 * Status : UNTESTED STUB 994 * 995 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 996 *****************************************************************************/ 997 998 ODINFUNCTION1(struct Wprotoent *,OS2getprotobynumber, 999 int,proto) 1000 { 1001 struct protoent *xx; 1002 PWSOCKTHREADDATA pwstd; 1003 1004 //PH: we assume PMWSOCK sets WSASetLastError correctly! 1005 xx = getprotobynumber(proto); 1006 1007 if(xx == NULL) 1008 return (WPROTOENT *)NULL; 1009 1010 // access current thread wsock data block 1011 pwstd = iQueryWsockThreadData(); 1012 1013 pwstd->wptnt.p_name = xx->p_name; 1014 pwstd->wptnt.p_aliases = xx->p_aliases; 1015 pwstd->wptnt.p_proto = (short)xx->p_proto; 1016 1017 return &pwstd->wptnt; 1018 } 1019 1020 1021 /***************************************************************************** 1022 * Name : 1023 * Purpose : 1024 * Parameters: 1025 * Variables : 1026 * Result : 1027 * Remark : 1028 * Status : UNTESTED STUB 1029 * 1030 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1031 *****************************************************************************/ 1032 1033 ODINFUNCTION1(struct Wprotoent *,OS2getprotobyname, 1034 const char *,name) 1035 { 1036 struct protoent *xx; 1037 PWSOCKTHREADDATA pwstd; 1038 1039 //PH: we assume PMWSOCK sets WSASetLastError correctly! 1040 xx = getprotobyname((char *)name); 1041 1042 if(xx == NULL) 1043 return (WPROTOENT *)NULL; 1044 1045 // access current thread wsock data block 1046 pwstd = iQueryWsockThreadData(); 1047 1048 pwstd->wptnt.p_name = xx->p_name; 1049 pwstd->wptnt.p_aliases = xx->p_aliases; 1050 pwstd->wptnt.p_proto = (short)xx->p_proto; 1051 1052 return &pwstd->wptnt; 1053 } 1054 1055 1056 1057 /* Microsoft Windows Extension function prototypes */ 1058 1059 /***************************************************************************** 1060 * Name : 1061 * Purpose : 1062 * Parameters: 1063 * Variables : 1064 * Result : 1065 * Remark : 1066 * Status : UNTESTED STUB 1067 * 1068 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1069 *****************************************************************************/ 1070 1071 ODINFUNCTION2(int,OS2WSAStartup, 1072 USHORT,wVersionRequired, 1073 LPWSADATA,lpWSAData) 1074 { 1075 fWSAInitialized = TRUE; 1076 return(WSAStartup(wVersionRequired, 1077 lpWSAData)); 1078 } 1079 1080 1081 /***************************************************************************** 1082 * Name : 1083 * Purpose : 1084 * Parameters: 1085 * Variables : 1086 * Result : 1087 * Remark : 1088 * Status : UNTESTED STUB 1089 * 1090 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1091 *****************************************************************************/ 1092 1093 ODINFUNCTION0(int,OS2WSACleanup) 1094 { 1095 fWSAInitialized = FALSE; 1096 return(WSACleanup()); 1097 } 1098 1099 1100 /***************************************************************************** 1101 * Name : 1102 * Purpose : 1103 * Parameters: 1104 * Variables : 1105 * Result : 1106 * Remark : 1107 * Status : UNTESTED STUB 1108 * 1109 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1110 *****************************************************************************/ 1111 1112 ODINFUNCTION0(BOOL,OS2WSAIsBlocking) 1113 { 1114 return WSAIsBlocking(); 1115 } 1116 1117 1118 /***************************************************************************** 1119 * Name : 1120 * Purpose : 1121 * Parameters: 1122 * Variables : 1123 * Result : 1124 * Remark : 1125 * Status : UNTESTED STUB 1126 * 1127 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1128 *****************************************************************************/ 1129 1130 ODINFUNCTION0(int,OS2WSAUnhookBlockingHook) 1131 { 1132 return WSAUnhookBlockingHook(); 1133 } 1134 1135 1136 /***************************************************************************** 1137 * Name : 1138 * Purpose : 1139 * Parameters: 1140 * Variables : 1141 * Result : 1142 * Remark : 1143 * Status : UNTESTED STUB 1144 * 1145 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1146 *****************************************************************************/ 1147 1148 ODINFUNCTION1(PFN,OS2WSASetBlockingHook, 1149 PFN,lpBlockFunc) 1150 { 1151 return(WSASetBlockingHook(lpBlockFunc)); 1152 } 1153 1154 1155 /***************************************************************************** 1156 * Name : 1157 * Purpose : 1158 * Parameters: 1159 * Variables : 1160 * Result : 1161 * Remark : 1162 * Status : UNTESTED STUB 1163 * 1164 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1165 *****************************************************************************/ 1166 1167 ODINFUNCTION0(int,OS2WSACancelBlockingCall) 1168 { 1169 return(WSACancelBlockingCall()); 1170 } 1171 1172 1173 /***************************************************************************** 1174 * Name : 1175 * Purpose : 1176 * Parameters: 1177 * Variables : 1178 * Result : 1179 * Remark : 1180 * Status : UNTESTED STUB 1181 * 1182 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1183 *****************************************************************************/ 1184 1185 ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByName, 1186 HWND,hWnd, 1187 u_int,wMsg, 1188 const char *,name, 1189 const char *,proto, 1190 char *,buf, 1191 int,buflen) 1192 { 1193 int rc; 1194 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1195 ULONG ulNewID; 1196 1197 if (hwndRelay == NULL) // already initialized ? 1198 hwndRelay = RelayInitialize(hwndOS2); 1199 1200 // add entry to list, we need to store both our temp buffer and the apps buffer 1201 ulNewID = RelayAlloc(hWnd, 1202 wMsg, 1203 ASYNCREQUEST_GETSERVBYNAME, 1204 FALSE, 1205 buf); 1206 1207 // call pmwsock function, will fill our temp buffer 1208 rc = WSAAsyncGetServByName(hwndRelay, 1209 ulNewID, 1210 name, 1211 proto, 1212 buf, 1213 buflen); 1214 1215 // if an error occurs, free the allocated relay entry 1216 if (rc == SOCKET_ERROR) 1217 RelayFree(ulNewID); 1218 1219 return (rc); 1220 } 1221 1222 1223 /***************************************************************************** 1224 * Name : 1225 * Purpose : 1226 * Parameters: 1227 * Variables : 1228 * Result : 1229 * Remark : 1230 * Status : UNTESTED STUB 1231 * 1232 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1233 *****************************************************************************/ 1234 1235 ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByPort, 1236 HWND,hWnd, 1237 u_int,wMsg, 1238 int,port, 1239 const char *,proto, 1240 char *,buf, 1241 int,buflen) 1242 { 1243 int rc; 1244 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1245 ULONG ulNewID; 1246 1247 if (hwndRelay == NULL) // already initialized ? 1248 hwndRelay = RelayInitialize(hwndOS2); 1249 1250 // add entry to list, we need to store both our temp buffer and the apps buffer 1251 ulNewID = RelayAlloc(hWnd, 1252 wMsg, 1253 ASYNCREQUEST_GETSERVBYPORT, 1254 FALSE, 1255 buf); 1256 1257 // call pmwsock function, will fill our temp buffer 1258 rc = WSAAsyncGetServByPort(hwndRelay, 1259 ulNewID, 1260 port, 1261 proto, 1262 buf, 1263 buflen); 1264 1265 // if an error occurs, free the allocated relay entry 1266 if (rc == SOCKET_ERROR) 1267 RelayFree(ulNewID); 1268 1269 return rc; 1270 } 1271 1272 1273 /***************************************************************************** 1274 * Name : 1275 * Purpose : 1276 * Parameters: 1277 * Variables : 1278 * Result : 1279 * Remark : 1280 * Status : UNTESTED STUB 1281 * 1282 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1283 *****************************************************************************/ 1284 1285 ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByName, 1286 HWND,hWnd, 1287 u_int,wMsg, 1288 const char *,name, 1289 char *,buf, 1290 int,buflen) 1291 { 1292 int rc; 1293 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1294 ULONG ulNewID; 1295 1296 if (hwndRelay == NULL) // already initialized ? 1297 hwndRelay = RelayInitialize(hwndOS2); 1298 1299 // add entry to list, we need to store both our temp buffer and the apps buffer 1300 ulNewID = RelayAlloc(hWnd, 1301 wMsg, 1302 ASYNCREQUEST_GETPROTOBYNAME, 1303 FALSE, 1304 buf); 1305 1306 // call pmwsock function, will fill our temp buffer 1307 rc = WSAAsyncGetProtoByName(hwndRelay, 1308 ulNewID, 1309 name, 1310 buf, 1311 buflen); 1312 1313 // if an error occurs, free the allocated relay entry 1314 if (rc == SOCKET_ERROR) 1315 RelayFree(ulNewID); 1316 1317 return (rc); 1318 } 1319 1320 1321 /***************************************************************************** 1322 * Name : 1323 * Purpose : 1324 * Parameters: 1325 * Variables : 1326 * Result : 1327 * Remark : 1328 * Status : UNTESTED STUB 1329 * 1330 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1331 *****************************************************************************/ 1332 1333 ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByNumber, 1334 HWND,hWnd, 1335 u_int,wMsg, 1336 int,number, 1337 char *,buf, 1338 int,buflen) 1339 { 1340 int rc; 1341 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1342 ULONG ulNewID; 1343 1344 if (hwndRelay == NULL) // already initialized ? 1345 hwndRelay = RelayInitialize(hwndOS2); 1346 1347 // add entry to list, we need to store both our temp buffer and the apps buffer 1348 ulNewID = RelayAlloc(hWnd, 1349 wMsg, 1350 ASYNCREQUEST_GETPROTOBYNUMBER, 1351 FALSE, 1352 buf); 1353 1354 // call pmwsock function, will fill our temp buffer 1355 rc = WSAAsyncGetProtoByNumber(hwndRelay, 1356 ulNewID, 1357 number, 1358 buf, 1359 buflen); 1360 1361 // if an error occurs, free the allocated relay entry 1362 if (rc == SOCKET_ERROR) 1363 RelayFree(ulNewID); 1364 1365 return rc; 1366 } 1367 1368 1369 /***************************************************************************** 1370 * Name : 1371 * Purpose : 1372 * Parameters: 1373 * Variables : 1374 * Result : 1375 * Remark : 1376 * Status : UNTESTED STUB 1377 * 1378 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1379 *****************************************************************************/ 1380 1381 ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetHostByName, 1382 HWND,hWnd, 1383 u_int,wMsg, 1384 const char *,name, 1385 char *,buf, 1386 int,buflen) 1387 { 1388 int rc; 1389 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1390 ULONG ulNewID; 1391 1392 dprintf(("WSAAsyncGetHostByName %s", name)); 1393 1394 if (hwndRelay == NULL) // already initialized ? 1395 hwndRelay = RelayInitialize(hwndOS2); 1396 1397 // add entry to list, we need to store both our temp buffer and the apps buffer 1398 ulNewID = RelayAlloc(hWnd, 1399 wMsg, 1400 ASYNCREQUEST_GETHOSTBYNAME, 1401 FALSE, 1402 (PVOID)buf, (PVOID)buflen); 1403 1404 // call pmwsock function, will fill our temp buffer 1405 rc = WSAAsyncGetHostByName(hwndRelay, 1406 ulNewID, 1407 name, 1408 buf, 1409 buflen); 1410 1411 // if an error occurs, free the allocated relay entry 1412 if (rc == SOCKET_ERROR) 1413 RelayFree(ulNewID); 1414 1415 return rc; 1416 } 1417 1418 1419 /***************************************************************************** 1420 * Name : 1421 * Purpose : 1422 * Parameters: 1423 * Variables : 1424 * Result : 1425 * Remark : 1426 * Status : UNTESTED STUB 1427 * 1428 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1429 *****************************************************************************/ 1430 1431 ODINFUNCTION7(LHANDLE,OS2WSAAsyncGetHostByAddr, 1432 HWND,hWnd, 1433 u_int,wMsg, 1027 1434 const char *,addr, 1028 1435 int,len, 1029 int,type) 1030 { 1031 LPWSINFO pwsi = WINSOCK_GetIData(); 1032 1033 if( pwsi ) 1034 { 1035 struct hostent* host; 1036 if( (host = gethostbyaddr((char *)addr, len, type)) != NULL ) { 1037 if( WS_dup_he(pwsi, host) ) { 1038 WSASetLastError(NO_ERROR); 1039 return pwsi->he; 1040 } 1041 else WSASetLastError(WSAENOBUFS); 1042 } 1043 else WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno()); 1044 } 1045 else WSASetLastError(WSANOTINITIALISED); 1046 return NULL; 1047 } 1048 //****************************************************************************** 1049 //****************************************************************************** 1050 ODINFUNCTION1(ws_hostent *,OS2gethostbyname, 1051 const char *,name) 1052 { 1053 LPWSINFO pwsi = WINSOCK_GetIData(); 1054 1055 if( pwsi ) 1056 { 1057 struct hostent* host; 1058 if( (host = gethostbyname((char *)name)) != NULL ) { 1059 if( WS_dup_he(pwsi, host) ) { 1060 WSASetLastError(NO_ERROR); 1061 return pwsi->he; 1062 } 1063 else WSASetLastError(WSAENOBUFS); 1064 } 1065 else WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno()); 1066 } 1067 else WSASetLastError(WSANOTINITIALISED); 1068 return NULL; 1069 } 1070 //****************************************************************************** 1071 //****************************************************************************** 1072 ODINFUNCTION2(struct ws_servent *,OS2getservbyport, 1073 int, port, 1074 const char *, proto) 1075 { 1076 LPWSINFO pwsi = WINSOCK_GetIData(); 1077 1078 if( pwsi ) 1079 { 1080 struct servent* serv; 1081 if( (serv = getservbyport(port, pwsi->buffer)) != NULL ) { 1082 if( WS_dup_se(pwsi, serv) ) { 1083 WSASetLastError(NO_ERROR); 1084 return pwsi->se; 1085 } 1086 else WSASetLastError(WSAENOBUFS); 1087 } 1088 else WSASetLastError(WSANO_DATA); 1089 } 1090 else WSASetLastError(WSANOTINITIALISED); 1091 return NULL; 1092 } 1093 //****************************************************************************** 1094 //****************************************************************************** 1095 ODINFUNCTION2(struct ws_servent *,OS2getservbyname, 1096 const char *, name, 1097 const char *, proto) 1098 { 1099 LPWSINFO pwsi = WINSOCK_GetIData(); 1100 1101 if( pwsi ) 1102 { 1103 struct servent* serv; 1104 if( (serv = getservbyname(pwsi->buffer, pwsi->buffer)) != NULL ) { 1105 if( WS_dup_se(pwsi, serv) ) { 1106 WSASetLastError(NO_ERROR); 1107 return pwsi->se; 1108 } 1109 else WSASetLastError(WSAENOBUFS); 1110 } 1111 else WSASetLastError(WSANO_DATA); 1112 } 1113 else WSASetLastError(WSANOTINITIALISED); 1114 return NULL; 1115 } 1116 //****************************************************************************** 1117 //****************************************************************************** 1118 ODINFUNCTION1(struct ws_protoent *,OS2getprotobynumber, 1119 int,number) 1120 { 1121 LPWSINFO pwsi = WINSOCK_GetIData(); 1122 1123 if( pwsi ) 1124 { 1125 struct protoent* proto; 1126 if( (proto = getprotobynumber(number)) != NULL ) { 1127 if( WS_dup_pe(pwsi, proto) ) { 1128 WSASetLastError(NO_ERROR); 1129 return pwsi->pe; 1130 } 1131 else WSASetLastError(WSAENOBUFS); 1132 } 1133 else WSASetLastError(WSANO_DATA); 1134 } 1135 else WSASetLastError(WSANOTINITIALISED); 1136 return NULL; 1137 } 1138 //****************************************************************************** 1139 //****************************************************************************** 1140 ODINFUNCTION1(struct ws_protoent *,OS2getprotobyname, 1141 const char *,name) 1142 { 1143 LPWSINFO pwsi = WINSOCK_GetIData(); 1144 1145 if( pwsi ) 1146 { 1147 struct protoent * proto; 1148 if( (proto = getprotobyname((char *)name)) != NULL ) { 1149 if(WS_dup_pe(pwsi, proto)) { 1150 WSASetLastError(NO_ERROR); 1151 return pwsi->pe; 1152 } 1153 else WSASetLastError(WSAENOBUFS); 1154 } 1155 else WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno()); 1156 } 1157 else WSASetLastError(WSANOTINITIALISED); 1158 return NULL; 1159 } 1160 //****************************************************************************** 1161 //****************************************************************************** 1436 int,type, 1437 char *,buf, 1438 int,buflen) 1439 { 1440 int rc; 1441 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1442 ULONG ulNewID; 1443 1444 if (hwndRelay == NULL) // already initialized ? 1445 hwndRelay = RelayInitialize(hwndOS2); 1446 1447 // add entry to list, we need to store both our temp buffer and the apps buffer 1448 ulNewID = RelayAlloc(hWnd, 1449 wMsg, 1450 ASYNCREQUEST_GETHOSTBYADDR, 1451 FALSE, 1452 buf); 1453 1454 // call pmwsock function, will fill our temp buffer 1455 rc = WSAAsyncGetHostByAddr(hwndRelay, 1456 ulNewID, 1457 addr, 1458 len, 1459 type, 1460 buf, 1461 buflen); 1462 1463 // if an error occurs, free the allocated relay entry 1464 if (rc == SOCKET_ERROR) 1465 RelayFree(ulNewID); 1466 1467 return (rc); 1468 } 1469 1470 1471 /***************************************************************************** 1472 * Name : 1473 * Purpose : 1474 * Parameters: 1475 * Variables : 1476 * Result : 1477 * Remark : 1478 * Status : UNTESTED STUB 1479 * 1480 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1481 *****************************************************************************/ 1482 1483 ODINFUNCTION1(int,OS2WSACancelAsyncRequest, 1484 LHANDLE,hAsyncTaskHandle) 1485 { 1486 return(WSACancelAsyncRequest(hAsyncTaskHandle)); 1487 } 1488 1489 1490 /***************************************************************************** 1491 * Name : 1492 * Purpose : 1493 * Parameters: 1494 * Variables : 1495 * Result : 1496 * Remark : 1497 * Status : UNTESTED STUB 1498 * 1499 * Author : Patrick Haller [Thu, 1999/11/25 23:00] 1500 *****************************************************************************/ 1501 1502 ODINFUNCTION4(int,OS2WSAAsyncSelect, 1503 SOCKET,s, 1504 HWND,hWnd, 1505 u_int,wMsg, 1506 long,lEvent) 1507 { 1508 int rc; 1509 // int iError; 1510 HWND hwndOS2 = Win32ToOS2Handle(hWnd); 1511 ULONG ulNewID; 1512 1513 if (hwndRelay == NULL) // already initialized ? 1514 hwndRelay = RelayInitialize(hwndOS2); 1515 1516 /* @@@PH: our source window doesn't seem to have an anchor block. 1517 Docs suggest we've missed to call WinInitialize on the 1518 caller thread. 1519 1520 Cause however is the Open32 handle is (of course!) invalid 1521 in plain PM Window Manager! -> use DAPWSOCK 1522 1523 Unfortunately, DAPWSOCK calls WinQueryAnchorBlock(hOpen32), too. 1524 So, we're stuck until I resolve hWnd to it's valid PM 1525 counterpart. 1526 1527 new problem: we've ultimately got to use PostMessageA instead 1528 anything else. => create invisible msg relay window: 1529 - hMsg = registerMessage(hWnd, wMsg) 1530 - call WSAAsyncSelect with object window handle 1531 - overwrite hWnd relay for "same handles" 1532 */ 1533 1534 // add event to list or remove any list entry in case of WSAAsyncSelect(hwnd,0,0) 1535 if ( (wMsg == 0) && (lEvent == 0) ) 1536 { 1537 // remove entry from list 1538 RelayFreeByHwnd(hWnd); 1539 } 1540 else 1541 // add entry to list 1542 ulNewID = RelayAlloc(hWnd, 1543 wMsg, 1544 ASYNCREQUEST_SELECT, 1545 FALSE); //SvL: allow multiple selects -> pmwsock should fail if it not allowed 1546 // TRUE); 1547 1548 rc = WSAAsyncSelect(s, 1549 hwndRelay, 1550 ulNewID, 1551 lEvent); 1552 1553 // if an error occurs, free the allocated relay entry 1554 if (rc == SOCKET_ERROR) 1555 RelayFree(ulNewID); 1556 1557 return (rc); 1558 } -
trunk/src/wsock32/wsock32.def
r3195 r3199 1 ; $Id: wsock32.def,v 1.16 2000-03-22 18:46:20 sandervl Exp $ 1 /* $Id: wsock32.def,v 1.17 2000-03-22 20:07:29 sandervl Exp $ */ 2 2 3 3 ;Created by BLAST for IBM's compiler … … 48 48 ; ---------------------------- 49 49 50 WSAAsyncSelect = _ WSAAsyncSelect@16 @10151 WSAAsyncGetHostByAddr = _ WSAAsyncGetHostByAddr@28 @10252 WSAAsyncGetHostByName = _ WSAAsyncGetHostByName@20 @10353 WSAAsyncGetProtoByNumber = _ WSAAsyncGetProtoByNumber@20 @10454 WSAAsyncGetProtoByName = _ WSAAsyncGetProtoByName@20 @10555 WSAAsyncGetServByPort = _ WSAAsyncGetServByPort@24 @10656 WSAAsyncGetServByName = _ WSAAsyncGetServByName@24 @10757 WSACancelAsyncRequest = _ WSACancelAsyncRequest@4 @10858 WSASetBlockingHook = _ WSASetBlockingHook@4 @10959 WSAUnhookBlockingHook = _ WSAUnhookBlockingHook@0 @11060 WSAGetLastError = _ WSAGetLastError@0 @11161 WSASetLastError = _ WSASetLastError@4 @11262 WSACancelBlockingCall = _ WSACancelBlockingCall@0 @11363 WSAIsBlocking = _ WSAIsBlocking@0 @11464 WSAStartup = _ WSAStartup@8 @11565 WSACleanup = _ WSACleanup@0 @11666 __WSAFDIsSet = _ __WSAFDIsSet@8 @15150 WSAAsyncSelect = _OS2WSAAsyncSelect@16 @101 51 WSAAsyncGetHostByAddr = _OS2WSAAsyncGetHostByAddr@28 @102 52 WSAAsyncGetHostByName = _OS2WSAAsyncGetHostByName@20 @103 53 WSAAsyncGetProtoByNumber = _OS2WSAAsyncGetProtoByNumber@20 @104 54 WSAAsyncGetProtoByName = _OS2WSAAsyncGetProtoByName@20 @105 55 WSAAsyncGetServByPort = _OS2WSAAsyncGetServByPort@24 @106 56 WSAAsyncGetServByName = _OS2WSAAsyncGetServByName@24 @107 57 WSACancelAsyncRequest = _OS2WSACancelAsyncRequest@4 @108 58 WSASetBlockingHook = _OS2WSASetBlockingHook@4 @109 59 WSAUnhookBlockingHook = _OS2WSAUnhookBlockingHook@0 @110 60 WSAGetLastError = _OS2WSAGetLastError@0 @111 61 WSASetLastError = _OS2WSASetLastError@4 @112 62 WSACancelBlockingCall = _OS2WSACancelBlockingCall@0 @113 63 WSAIsBlocking = _OS2WSAIsBlocking@0 @114 64 WSAStartup = _OS2WSAStartup@8 @115 65 WSACleanup = _OS2WSACleanup@0 @116 66 __WSAFDIsSet = _OS2__WSAFDIsSet@8 @151 67 67 68 68 rcmd = _OS2rcmd@24 @1102 69 69 rexec = _OS2rexec@24 @1103 70 WSARecvEx = _ WSARecvEx@16 @110770 WSARecvEx = _OS2WSARecvEx@16 @1107 71 71 s_perror = _OS2s_perror@8 @1108 72 72 -
trunk/src/wsock32/wsock32.h
r3195 r3199 1 /* $Id: wsock32.h,v 1.11 2000-03-22 18:46:20 sandervl Exp $ */ 1 ; $Id: wsock32.h,v 1.12 2000-03-22 20:07:30 sandervl Exp $ 2 2 3 3 /* WSOCK32.H--definitions & conversions for Odin's wsock32.dll. … … 16 16 #define _WINSOCK32CONST_ 17 17 18 #include <sys\socket.h>19 #include <sys\ioctl.h>20 #include <netdb.h>21 #include <netinet\in.h>22 #include <netinet\tcp.h>23 #include <nerrno.h>24 #include <sys\time.h>25 26 /*27 * Socket state bits.28 */29 #define SS_NOFDREF 0x0001 /* no file table ref any more */30 #define SS_ISCONNECTED 0x0002 /* socket connected to a peer */31 #define SS_ISCONNECTING 0x0004 /* in process of connecting to peer */32 #define SS_ISDISCONNECTING 0x0008 /* in process of disconnecting */33 #define SS_CANTSENDMORE 0x0010 /* can't send more data to peer */34 #define SS_CANTRCVMORE 0x0020 /* can't receive more data from peer */35 #define SS_RCVATMARK 0x0040 /* at mark on input */36 37 #define SS_NBIO 0x0100 /* non-blocking ops */38 #define SS_ASYNC 0x0200 /* async i/o notify */39 #define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */40 41 #define SS_INCOMP 0x0800 /* unaccepted, incomplete connection */42 #define SS_COMP 0x1000 /* unaccepted, complete connection */43 #define SS_ISDISCONNECTED 0x2000 /* socket disconnected from peer */44 45 //socketopt options46 #define SO_DONTLINGER (u_int)(~SO_LINGER)47 48 // WSAAsyncSelect flags49 #define FD_READ 0x0150 #define FD_WRITE 0x0251 #define FD_OOB 0x0452 #define FD_ACCEPT 0x0853 #define FD_CONNECT 0x1054 #define FD_CLOSE 0x2055 56 #define SOCKET_ERROR -157 #define NO_ERROR 058 59 #define WSABASEERR 1000060 61 #define WSAEINTR (WSABASEERR+4)62 #define WSAEBADF (WSABASEERR+9)63 #define WSAEACCES (WSABASEERR+13)64 #define WSAEFAULT (WSABASEERR+14)65 #define WSAEINVAL (WSABASEERR+22)66 #define WSAEMFILE (WSABASEERR+24)67 68 #define WSAEWOULDBLOCK (WSABASEERR+35)69 #define WSAEINPROGRESS (WSABASEERR+36)70 #define WSAEALREADY (WSABASEERR+37)71 #define WSAENOTSOCK (WSABASEERR+38)72 #define WSAEDESTADDRREQ (WSABASEERR+39)73 #define WSAEMSGSIZE (WSABASEERR+40)74 #define WSAEPROTOTYPE (WSABASEERR+41)75 #define WSAENOPROTOOPT (WSABASEERR+42)76 #define WSAEPROTONOSUPPORT (WSABASEERR+43)77 #define WSAESOCKTNOSUPPORT (WSABASEERR+44)78 #define WSAEOPNOTSUPP (WSABASEERR+45)79 #define WSAEPFNOSUPPORT (WSABASEERR+46)80 #define WSAEAFNOSUPPORT (WSABASEERR+47)81 #define WSAEADDRINUSE (WSABASEERR+48)82 #define WSAEADDRNOTAVAIL (WSABASEERR+49)83 #define WSAENETDOWN (WSABASEERR+50)84 #define WSAENETUNREACH (WSABASEERR+51)85 #define WSAENETRESET (WSABASEERR+52)86 #define WSAECONNABORTED (WSABASEERR+53)87 #define WSAECONNRESET (WSABASEERR+54)88 #define WSAENOBUFS (WSABASEERR+55)89 #define WSAEISCONN (WSABASEERR+56)90 #define WSAENOTCONN (WSABASEERR+57)91 #define WSAESHUTDOWN (WSABASEERR+58)92 #define WSAETOOMANYREFS (WSABASEERR+59)93 #define WSAETIMEDOUT (WSABASEERR+60)94 #define WSAECONNREFUSED (WSABASEERR+61)95 #define WSAELOOP (WSABASEERR+62)96 #define WSAENAMETOOLONG (WSABASEERR+63)97 #define WSAEHOSTDOWN (WSABASEERR+64)98 #define WSAEHOSTUNREACH (WSABASEERR+65)99 #define WSAENOTEMPTY (WSABASEERR+66)100 #define WSAEPROCLIM (WSABASEERR+67)101 #define WSAEUSERS (WSABASEERR+68)102 #define WSAEDQUOT (WSABASEERR+69)103 #define WSAESTALE (WSABASEERR+70)104 #define WSAEREMOTE (WSABASEERR+71)105 #define WSASYSNOTREADY (WSABASEERR+91)106 #define WSAVERNOTSUPPORTED (WSABASEERR+92)107 #define WSANOTINITIALISED (WSABASEERR+93)108 #define WSAHOST_NOT_FOUND (WSABASEERR+1001)109 #define WSATRY_AGAIN (WSABASEERR+1002)110 #define WSANO_RECOVERY (WSABASEERR+1003)111 #define WSANO_DATA (WSABASEERR+1004)112 #define WSANO_ADDRESS WSANO_DATA113 114 typedef u_int SOCKET;115 116 #define FD_SETSIZE 64117 118 #pragma pack(1)119 120 #define WSADESCRIPTION_LEN 256121 #define WSASYS_STATUS_LEN 128122 123 typedef struct WSAData {124 USHORT wVersion;125 USHORT wHighVersion;126 char szDescription[WSADESCRIPTION_LEN+1];127 char szSystemStatus[WSASYS_STATUS_LEN+1];128 unsigned short iMaxSockets;129 unsigned short iMaxUdpDg;130 char * lpVendorInfo;131 } WSADATA;132 typedef WSADATA *PWSADATA;133 typedef WSADATA *LPWSADATA;134 135 typedef struct ws_fd_set {136 u_int fd_count;137 SOCKET fd_array[FD_SETSIZE];138 } _ws_fd_set;139 18 140 19 /* 141 20 * Structure used for manipulating linger option. 142 21 */ 143 typedef struct ws_linger {22 struct Wlinger { 144 23 u_short l_onoff; /* option on/off */ 145 24 u_short l_linger; /* linger time */ 146 } _ws_linger; 25 }; 26 147 27 148 28 /* … … 152 32 */ 153 33 154 typedef struct ws_hostent 34 struct Whostent { 35 char * h_name; /* official name of host */ 36 char * * h_aliases; /* alias list */ 37 short h_addrtype; /* host address type */ 38 short h_length; /* length of address */ 39 char * * h_addr_list; /* list of addresses */ 40 #define h_addr h_addr_list[0] /* address, for backward compat */ 41 }; 42 43 /* 44 * It is assumed here that a network number 45 * fits in 32 bits. 46 */ 47 struct Wnetent { 48 char * n_name; /* official name of net */ 49 char * * n_aliases; /* alias list */ 50 short n_addrtype; /* net address type */ 51 u_long n_net; /* network # */ 52 }; 53 typedef struct Whostent WHOSTENT; 54 typedef WHOSTENT *PWHOSTENT; 55 56 struct Wservent { 57 char * s_name; /* official service name */ 58 char * * s_aliases; /* alias list */ 59 short s_port; /* port # */ 60 char * s_proto; /* protocol to use */ 61 }; 62 typedef struct Wservent WSERVENT; 63 typedef WSERVENT *PWSERVENT; 64 65 struct Wprotoent { 66 char * p_name; /* official protocol name */ 67 char * * p_aliases; /* alias list */ 68 short p_proto; /* protocol # */ 69 }; 70 typedef struct Wprotoent WPROTOENT; 71 typedef WPROTOENT *PWPROTOENT; 72 73 typedef struct tagWsockThreadData 155 74 { 156 char * h_name; /* official name of host */ 157 char ** h_aliases; /* alias list */ 158 INT16 h_addrtype; /* host address type */ 159 INT16 h_length; /* length of address */ 160 char ** h_addr_list; /* list of addresses from name server */ 161 } _ws_hostent; 75 int dwLastError; // Get/SetLastError 76 struct Whostent whsnt; // database conversion buffers 77 struct Wservent wsvnt; 78 struct Wprotoent wptnt; 79 struct Wnetent wntnt; 80 struct Wlinger wlinger; 81 } WSOCKTHREADDATA, *PWSOCKTHREADDATA; 162 82 163 typedef struct ws_protoent 164 { 165 char * p_name; /* official protocol name */ 166 char ** p_aliases; /* alias list */ 167 INT16 p_proto; /* protocol # */ 168 } _ws_protoent; 83 // internal prototype 84 PWSOCKTHREADDATA iQueryWsockThreadData(void); 169 85 170 typedef struct ws_servent171 {172 char * s_name; /* official service name */173 char ** s_aliases; /* alias list */174 INT16 s_port; /* port # */175 char * s_proto; /* protocol to use */176 } _ws_servent;177 178 typedef struct ws_netent179 {180 char * n_name; /* official name of net */181 char ** n_aliases; /* alias list */182 INT16 n_addrtype; /* net address type */183 INT n_net; /* network # */184 } _ws_netent;185 186 #pragma pack()187 188 #define WS_MAX_SOCKETS_PER_PROCESS 128 /* reasonable guess */189 #define WS_MAX_UDP_DATAGRAM 1024190 191 #define WSI_BLOCKINGCALL 0x00000001 /* per-thread info flags */192 #define WSI_BLOCKINGHOOK 0x00000002 /* 32-bit callback */193 194 typedef struct _WSINFO195 {196 DWORD dwThisThread;197 struct _WSINFO *lpNextIData;198 199 unsigned flags;200 INT16 num_startup; /* reference counter */201 INT16 num_async_rq;202 INT16 last_free; /* entry in the socket table */203 USHORT buflen;204 char* buffer; /* allocated from char * heap */205 struct ws_hostent *he;206 int helen;207 struct ws_servent *se;208 int selen;209 struct ws_protoent *pe;210 int pelen;211 char* dbuffer; /* buffer for dummies (32 bytes) */212 213 DWORD blocking_hook;214 } WSINFO, *LPWSINFO;215 216 void WIN32API WSASetLastError(int iError);217 int WIN32API WSAGetLastError(void);218 BOOL WIN32API WSAIsBlocking(void);219 int WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);220 86 221 87 extern BOOL fWSAInitialized; 222 88 223 UINT wsaErrno(); 224 UINT wsaHerrno(); 89 void WIN32API OS2WSASetLastError(int iError); 225 90 226 #define CURRENT_THREAD -1 227 void WSASetBlocking(BOOL fBlock, HANDLE tid = CURRENT_THREAD); 91 int WIN32API OS2WSAGetLastError(void); 228 92 229 void WINSOCK_DeleteIData(void); 230 BOOL WINSOCK_CreateIData(void); 231 LPWSINFO WINSOCK_GetIData(HANDLE tid = CURRENT_THREAD); 93 BOOL WIN32API OS2WSAIsBlocking(void); 232 94 233 95 #endif /* _WINSOCK32CONST_ */
Note:
See TracChangeset
for help on using the changeset viewer.