source: trunk/src/wsock32/new/wsa.cpp

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

wsock32\new update

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