source: trunk/src/wsock32/wsa.cpp@ 10367

Last change on this file since 10367 was 9627, checked in by sandervl, 23 years ago

Better method to cancel all async requests in WSACleanup

File size: 7.5 KB
Line 
1/* $Id: wsa.cpp,v 1.10 2003-01-06 13:05:40 sandervl Exp $ */
2
3/*
4 *
5 * Win32 SOCK32 for OS/2 (WSA apis)
6 *
7 * Copyright (C) 2000 Sander van Leeuwen (sandervl@xs4all.nl)
8 *
9 * Based on Wine code: (dlls\winsock\async.c,socket.c)
10 * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka.
11 * (C) 1999 Marcus Meissner
12 *
13 * Project Odin Software License can be found in LICENSE.TXT
14 *
15 */
16#define INCL_BASE
17#include <os2wrap.h>
18#include <stdio.h>
19#include <string.h>
20#include <odin.h>
21#include <odinwrap.h>
22#include <os2sel.h>
23#include <misc.h>
24#include <win32api.h>
25
26#include "wsock32.h"
27#include "asyncthread.h"
28
29#define DBG_LOCALLOG DBG_wsa
30#include "dbglocal.h"
31
32ODINDEBUGCHANNEL(WSOCK32-WSA)
33
34//kso: dirty fix to make this compile! not permanent!
35BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *p);
36#define LowPart u.LowPart
37
38
39#ifndef winsockcleanupsockets
40// Exported by SO32DLL. Used to close all open sockets.
41void SYSTEM winsockcleanupsockets(void);
42#endif
43
44static void WSASetBlocking(BOOL fBlock);
45
46BOOL fWSAInitialized = FALSE;
47static int num_startup = 0;
48
49//******************************************************************************
50WSADATA WINSOCK_data = { 0x0202, 0x0202,
51 "Odin Sockets 2.0", "OS/2",
52 WS_MAX_SOCKETS_PER_PROCESS,
53 WS_MAX_UDP_DATAGRAM, NULL };
54//******************************************************************************
55ODINFUNCTION2(int, WSAStartup,
56 USHORT,wVersionRequested,
57 LPWSADATA,lpWSAData)
58{
59 LPWSINFO pwsi;
60
61 if (LOBYTE(wVersionRequested) < 1 || (LOBYTE(wVersionRequested) == 1 &&
62 HIBYTE(wVersionRequested) < 1)) return WSAVERNOTSUPPORTED;
63
64 if (!lpWSAData) return WSAEINVAL;
65
66 if(fWSAInitialized == FALSE)
67 {
68 WINSOCK_CreateIData();
69 pwsi = WINSOCK_GetIData();
70
71 sock_init();
72 }
73 else pwsi = WINSOCK_GetIData();
74
75 if (!pwsi) return WSASYSNOTREADY;
76
77 num_startup++;
78 fWSAInitialized = TRUE;
79
80 /* return winsock information */
81 memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data));
82
83 lpWSAData->wVersion = wVersionRequested;
84 return 0;
85}
86//******************************************************************************
87//******************************************************************************
88ODINFUNCTION0(int,WSACleanup)
89{
90 LPWSINFO pwsi = WINSOCK_GetIData();
91 if( pwsi ) {
92 if( --num_startup > 0 ) return 0;
93
94 WSACancelAllAsyncRequests();
95 winsockcleanupsockets();
96 WSAWaitForAllAsyncRequests();
97
98 fWSAInitialized = FALSE;
99 WINSOCK_DeleteIData();
100 return 0;
101 }
102 SetLastError(WSANOTINITIALISED);
103 return SOCKET_ERROR;
104}
105//******************************************************************************
106//TODO: Implement this
107//******************************************************************************
108ODINFUNCTION1(FARPROC,WSASetBlockingHook,
109 FARPROC,lpBlockFunc)
110{
111 FARPROC prev;
112 LPWSINFO pwsi = WINSOCK_GetIData();
113
114 if( pwsi ) {
115 prev = (FARPROC)pwsi->blocking_hook;
116 pwsi->blocking_hook = (DWORD)lpBlockFunc;
117 pwsi->flags |= WSI_BLOCKINGHOOK;
118 return prev;
119 }
120 return NULL;
121}
122//******************************************************************************
123//TODO: Implement this
124//******************************************************************************
125ODINFUNCTION0(int,WSAUnhookBlockingHook)
126{
127 LPWSINFO pwsi = WINSOCK_GetIData();
128
129 if( pwsi )
130 {
131 pwsi->blocking_hook = 0;
132 pwsi->flags &= ~WSI_BLOCKINGHOOK;
133 return 0;
134 }
135 return SOCKET_ERROR;
136}
137//******************************************************************************
138//******************************************************************************
139BOOL WIN32API WSAIsBlocking()
140{
141 LPWSINFO pwsi = WINSOCK_GetIData();
142
143 if( pwsi )
144 {
145 return (pwsi->flags & WSI_BLOCKINGCALL) == WSI_BLOCKINGCALL;
146 }
147 DebugInt3();
148 return FALSE; //shouldn't happen
149}
150//******************************************************************************
151//******************************************************************************
152void WSASetBlocking(BOOL fBlock, HANDLE tid)
153{
154 LPWSINFO pwsi = WINSOCK_GetIData(tid);
155
156 if( pwsi )
157 {
158 if(fBlock) {
159 pwsi->flags |= WSI_BLOCKINGCALL;
160 }
161 else pwsi->flags &= ~WSI_BLOCKINGCALL;
162 return;
163 }
164 DebugInt3();
165}
166//******************************************************************************
167//******************************************************************************
168ODINFUNCTION2(int,__WSAFDIsSet,SOCKET, s, ws_fd_set*,set)
169{
170 int i = set->fd_count;
171
172 if(set) {
173 while (i--) {
174 if (set->fd_array[i] == s) return 1;
175 }
176 }
177
178 return 0;
179}
180//******************************************************************************
181//******************************************************************************
182UINT wsaErrno()
183{
184 int loc_errno = sock_errno();
185
186 //Warp 4 returns errors with base 0
187 if(loc_errno && loc_errno < SOCBASEERR) {
188 loc_errno += SOCBASEERR;
189 }
190 switch(loc_errno)
191 {
192 case SOCEINTR: return WSAEINTR;
193 case SOCEBADF: return WSAEBADF;
194 case SOCEPERM:
195 case SOCEACCES: return WSAEACCES;
196 case SOCEFAULT: return WSAEFAULT;
197 case SOCEINVAL: return WSAEINVAL;
198 case SOCEMFILE: return WSAEMFILE;
199 case SOCEWOULDBLOCK: return WSAEWOULDBLOCK;
200 case SOCEINPROGRESS: return WSAEINPROGRESS;
201 case SOCEALREADY: return WSAEALREADY;
202 case SOCENOTSOCK: return WSAENOTSOCK;
203 case SOCEDESTADDRREQ: return WSAEDESTADDRREQ;
204 case SOCEMSGSIZE: return WSAEMSGSIZE;
205 case SOCEPROTOTYPE: return WSAEPROTOTYPE;
206 case SOCENOPROTOOPT: return WSAENOPROTOOPT;
207 case SOCEPROTONOSUPPORT:return WSAEPROTONOSUPPORT;
208 case SOCESOCKTNOSUPPORT:return WSAESOCKTNOSUPPORT;
209 case SOCEOPNOTSUPP: return WSAEOPNOTSUPP;
210 case SOCEPFNOSUPPORT: return WSAEPFNOSUPPORT;
211 case SOCEAFNOSUPPORT: return WSAEAFNOSUPPORT;
212 case SOCEADDRINUSE: return WSAEADDRINUSE;
213 case SOCEADDRNOTAVAIL: return WSAEADDRNOTAVAIL;
214 case SOCENETDOWN: return WSAENETDOWN;
215 case SOCENETUNREACH: return WSAENETUNREACH;
216 case SOCENETRESET: return WSAENETRESET;
217 case SOCECONNABORTED: return WSAECONNABORTED;
218 case SOCEPIPE:
219 case SOCECONNRESET: return WSAECONNRESET;
220 case SOCENOBUFS: return WSAENOBUFS;
221 case SOCEISCONN: return WSAEISCONN;
222 case SOCENOTCONN: return WSAENOTCONN;
223 case SOCESHUTDOWN: return WSAESHUTDOWN;
224 case SOCETOOMANYREFS: return WSAETOOMANYREFS;
225 case SOCETIMEDOUT: return WSAETIMEDOUT;
226 case SOCECONNREFUSED: return WSAECONNREFUSED;
227 case SOCELOOP: return WSAELOOP;
228 case SOCENAMETOOLONG: return WSAENAMETOOLONG;
229 case SOCEHOSTDOWN: return WSAEHOSTDOWN;
230 case SOCEHOSTUNREACH: return WSAEHOSTUNREACH;
231 case SOCENOTEMPTY: return WSAENOTEMPTY;
232 case SOCENXIO:
233 case SOCESRCH:
234 case SOCEOS2ERR: return WSAEFAULT;
235
236 /* just in case we ever get here and there are no problems */
237 case 0: return 0;
238 default:
239 dprintf(("Unknown errno %d!\n", loc_errno));
240 return WSAEOPNOTSUPP;
241 }
242}
243//******************************************************************************
244//******************************************************************************
245UINT wsaHerrno()
246{
247 int loc_errno = h_errno;
248
249 switch(loc_errno)
250 {
251 case HOST_NOT_FOUND: return WSAHOST_NOT_FOUND;
252 case TRY_AGAIN: return WSATRY_AGAIN;
253 case NO_RECOVERY: return WSANO_RECOVERY;
254 case NO_DATA: return WSANO_DATA;
255
256 case 0: return 0;
257 default:
258 dprintf(("Unknown h_errno %d!\n", loc_errno));
259 return WSAEOPNOTSUPP;
260 }
261}
262//******************************************************************************
263//******************************************************************************
Note: See TracBrowser for help on using the repository browser.