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

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

* empty log message *

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