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

Last change on this file since 3282 was 3282, checked in by sandervl, 25 years ago

wsastartup/cleanup + select fixes

File size: 7.2 KB
Line 
1/* $Id: wsa.cpp,v 1.5 2000-03-30 20:52:55 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#ifndef winsockcleanupsockets
35// Exported by SO32DLL. Used to close all open sockets.
36void _System winsockcleanupsockets(void);
37#endif
38
39static void WSASetBlocking(BOOL fBlock);
40
41BOOL fWSAInitialized = FALSE;
42static int num_startup = 0;
43
44//******************************************************************************
45WSADATA WINSOCK_data = { 0x0101, 0x0101,
46 "Odin Sockets 1.1", "OS/2",
47 WS_MAX_SOCKETS_PER_PROCESS,
48 WS_MAX_UDP_DATAGRAM, NULL };
49//******************************************************************************
50ODINFUNCTION2(int, WSAStartup,
51 USHORT,wVersionRequested,
52 LPWSADATA,lpWSAData)
53{
54 LPWSINFO pwsi;
55
56 if (LOBYTE(wVersionRequested) < 1 || (LOBYTE(wVersionRequested) == 1 &&
57 HIBYTE(wVersionRequested) < 1)) return WSAVERNOTSUPPORTED;
58
59 if (!lpWSAData) return WSAEINVAL;
60
61 if(fWSAInitialized == FALSE)
62 {
63 WINSOCK_CreateIData();
64 pwsi = WINSOCK_GetIData();
65
66 sock_init();
67 }
68 else pwsi = WINSOCK_GetIData();
69
70 if (!pwsi) return WSASYSNOTREADY;
71
72 num_startup++;
73 fWSAInitialized = TRUE;
74
75 /* return winsock information */
76 memcpy(lpWSAData, &WINSOCK_data, sizeof(WINSOCK_data));
77
78 return 0;
79}
80//******************************************************************************
81//******************************************************************************
82ODINFUNCTION0(int,WSACleanup)
83{
84 LPWSINFO pwsi = WINSOCK_GetIData();
85 if( pwsi ) {
86 if( --num_startup > 0 ) return 0;
87
88 winsockcleanupsockets();
89
90 fWSAInitialized = FALSE;
91 WINSOCK_DeleteIData();
92 return 0;
93 }
94 SetLastError(WSANOTINITIALISED);
95 return SOCKET_ERROR;
96}
97//******************************************************************************
98//TODO: Implement this
99//******************************************************************************
100ODINFUNCTION1(FARPROC,WSASetBlockingHook,
101 FARPROC,lpBlockFunc)
102{
103 FARPROC prev;
104 LPWSINFO pwsi = WINSOCK_GetIData();
105
106 if( pwsi ) {
107 prev = (FARPROC)pwsi->blocking_hook;
108 pwsi->blocking_hook = (DWORD)lpBlockFunc;
109 pwsi->flags |= WSI_BLOCKINGHOOK;
110 return prev;
111 }
112 return NULL;
113}
114//******************************************************************************
115//TODO: Implement this
116//******************************************************************************
117ODINFUNCTION0(int,WSAUnhookBlockingHook)
118{
119 LPWSINFO pwsi = WINSOCK_GetIData();
120
121 if( pwsi )
122 {
123 pwsi->blocking_hook = 0;
124 pwsi->flags &= ~WSI_BLOCKINGHOOK;
125 return 0;
126 }
127 return SOCKET_ERROR;
128}
129//******************************************************************************
130//******************************************************************************
131BOOL WIN32API WSAIsBlocking()
132{
133 LPWSINFO pwsi = WINSOCK_GetIData();
134
135 if( pwsi )
136 {
137 return (pwsi->flags & WSI_BLOCKINGCALL) == WSI_BLOCKINGCALL;
138 }
139 DebugInt3();
140 return FALSE; //shouldn't happen
141}
142//******************************************************************************
143//******************************************************************************
144void WSASetBlocking(BOOL fBlock, HANDLE tid)
145{
146 LPWSINFO pwsi = WINSOCK_GetIData(tid);
147
148 if( pwsi )
149 {
150 if(fBlock) {
151 pwsi->flags |= WSI_BLOCKINGCALL;
152 }
153 else pwsi->flags &= ~WSI_BLOCKINGCALL;
154 return;
155 }
156 DebugInt3();
157}
158//******************************************************************************
159//******************************************************************************
160ODINFUNCTION2(int,__WSAFDIsSet,SOCKET, s, ws_fd_set*,set)
161{
162 int i = set->fd_count;
163
164 while (i--)
165 if (set->fd_array[i] == s) return 1;
166
167 return 0;
168}
169//******************************************************************************
170//******************************************************************************
171UINT wsaErrno()
172{
173 int loc_errno = sock_errno();
174
175 //Warp 4 returns errors with base 0
176 if(loc_errno && loc_errno < SOCBASEERR) {
177 loc_errno += SOCBASEERR;
178 }
179 switch(loc_errno)
180 {
181 case SOCEINTR: return WSAEINTR;
182 case SOCEBADF: return WSAEBADF;
183 case SOCEPERM:
184 case SOCEACCES: return WSAEACCES;
185 case SOCEFAULT: return WSAEFAULT;
186 case SOCEINVAL: return WSAEINVAL;
187 case SOCEMFILE: return WSAEMFILE;
188 case SOCEWOULDBLOCK: return WSAEWOULDBLOCK;
189 case SOCEINPROGRESS: return WSAEINPROGRESS;
190 case SOCEALREADY: return WSAEALREADY;
191 case SOCENOTSOCK: return WSAENOTSOCK;
192 case SOCEDESTADDRREQ: return WSAEDESTADDRREQ;
193 case SOCEMSGSIZE: return WSAEMSGSIZE;
194 case SOCEPROTOTYPE: return WSAEPROTOTYPE;
195 case SOCENOPROTOOPT: return WSAENOPROTOOPT;
196 case SOCEPROTONOSUPPORT:return WSAEPROTONOSUPPORT;
197 case SOCESOCKTNOSUPPORT:return WSAESOCKTNOSUPPORT;
198 case SOCEOPNOTSUPP: return WSAEOPNOTSUPP;
199 case SOCEPFNOSUPPORT: return WSAEPFNOSUPPORT;
200 case SOCEAFNOSUPPORT: return WSAEAFNOSUPPORT;
201 case SOCEADDRINUSE: return WSAEADDRINUSE;
202 case SOCEADDRNOTAVAIL: return WSAEADDRNOTAVAIL;
203 case SOCENETDOWN: return WSAENETDOWN;
204 case SOCENETUNREACH: return WSAENETUNREACH;
205 case SOCENETRESET: return WSAENETRESET;
206 case SOCECONNABORTED: return WSAECONNABORTED;
207 case SOCEPIPE:
208 case SOCECONNRESET: return WSAECONNRESET;
209 case SOCENOBUFS: return WSAENOBUFS;
210 case SOCEISCONN: return WSAEISCONN;
211 case SOCENOTCONN: return WSAENOTCONN;
212 case SOCESHUTDOWN: return WSAESHUTDOWN;
213 case SOCETOOMANYREFS: return WSAETOOMANYREFS;
214 case SOCETIMEDOUT: return WSAETIMEDOUT;
215 case SOCECONNREFUSED: return WSAECONNREFUSED;
216 case SOCELOOP: return WSAELOOP;
217 case SOCENAMETOOLONG: return WSAENAMETOOLONG;
218 case SOCEHOSTDOWN: return WSAEHOSTDOWN;
219 case SOCEHOSTUNREACH: return WSAEHOSTUNREACH;
220 case SOCENOTEMPTY: return WSAENOTEMPTY;
221 case SOCENXIO:
222 case SOCESRCH:
223 case SOCEOS2ERR: return WSAEFAULT;
224
225 /* just in case we ever get here and there are no problems */
226 case 0: return 0;
227 default:
228 dprintf(("Unknown errno %d!\n", loc_errno));
229 return WSAEOPNOTSUPP;
230 }
231}
232//******************************************************************************
233//******************************************************************************
234UINT wsaHerrno()
235{
236 int loc_errno = h_errno;
237
238 switch(loc_errno)
239 {
240 case HOST_NOT_FOUND: return WSAHOST_NOT_FOUND;
241 case TRY_AGAIN: return WSATRY_AGAIN;
242 case NO_RECOVERY: return WSANO_RECOVERY;
243 case NO_DATA: return WSANO_DATA;
244
245 case 0: return 0;
246 default:
247 dprintf(("Unknown h_errno %d!\n", loc_errno));
248 return WSAEOPNOTSUPP;
249 }
250}
251//******************************************************************************
252//******************************************************************************
Note: See TracBrowser for help on using the repository browser.