diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-01-16 23:55:53 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-01-16 23:55:53 +0000 |
commit | 8c1f4d7bace6ff2c99d546cedaba890b349e88f8 (patch) | |
tree | e5c6e29deaaa7db42fbc75d0fdef32457bb0c8f2 /src/win32_compatibility.cpp | |
parent | 0a43e790cf9798948ab989abe88f890813c935df (diff) | |
download | libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.gz libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.bz2 libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.xz libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.zip |
I...think that's a little better. Wow, function pointers in windows have a
lot of problems. This may require a little more research, but basically, you
can't just call them inline wherever you'd like. I managed to get it to work
by providing simple one line wrapper functions for each function we acquired as
a pointer. Crazy mess. Anyway, it should load the library just once now, and
Bu::Socket looks a little bit cleaner, but not a heck of a lot.
I also added some more docs and removed the author references.
Diffstat (limited to 'src/win32_compatibility.cpp')
-rw-r--r-- | src/win32_compatibility.cpp | 434 |
1 files changed, 117 insertions, 317 deletions
diff --git a/src/win32_compatibility.cpp b/src/win32_compatibility.cpp index 54fd56c..b85e869 100644 --- a/src/win32_compatibility.cpp +++ b/src/win32_compatibility.cpp | |||
@@ -2,352 +2,152 @@ | |||
2 | 2 | ||
3 | #ifdef WIN32 | 3 | #ifdef WIN32 |
4 | 4 | ||
5 | typedef int (__cdecl *FNDEF_DYN_WSAStartup)(WORD,LPWSADATA); | 5 | #define deffunc( name ) \ |
6 | int DynamicWinsock2::WSAStartup( | 6 | Bu::Winsock2::FNDEF_DYN_ ##name Bu::Winsock2::_fnptr_ ##name = NULL |
7 | WORD wVersionRequested,LPWSADATA lpWSAData) | 7 | |
8 | char Bu::Winsock2::scode[15]; | ||
9 | |||
10 | deffunc( WSAStartup ); | ||
11 | deffunc( WSACleanup ); | ||
12 | deffunc( WSAGetLastError ); | ||
13 | deffunc( inet_ntoa ); | ||
14 | deffunc( inet_addr ); | ||
15 | deffunc( select ); | ||
16 | deffunc( socket ); | ||
17 | deffunc( ioctlsocket ); | ||
18 | deffunc( htons ); | ||
19 | deffunc( htonl ); | ||
20 | deffunc( gethostbyname ); | ||
21 | deffunc( freeaddrinfo ); | ||
22 | deffunc( getaddrinfo ); | ||
23 | deffunc( connect ); | ||
24 | deffunc( getpeername ); | ||
25 | deffunc( setsockopt ); | ||
26 | deffunc( bind ); | ||
27 | deffunc( listen ); | ||
28 | deffunc( accept ); | ||
29 | deffunc( recv ); | ||
30 | deffunc( send ); | ||
31 | deffunc( __WSAFDIsSet ); | ||
32 | |||
33 | // Safely get a function from the library | ||
34 | #define getfunc( name ) \ | ||
35 | Bu::Winsock2::_fnptr_ ##name = (FNDEF_DYN_ ##name) \ | ||
36 | GetProcAddress( Ws2_32, #name ); \ | ||
37 | if( Bu::Winsock2::_fnptr_ ##name == NULL ) { \ | ||
38 | throw Bu::ExceptionBase("Error loading function " #name " from dll.");\ | ||
39 | } (void)0 | ||
40 | |||
41 | Bu::Winsock2::Winsock2() | ||
8 | { | 42 | { |
9 | int out=0; | 43 | Ws2_32 = LoadLibrary(TEXT("WS2_32.DLL")); |
10 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("WS2_32.DLL")); | 44 | |
11 | if( Ws2_32 != NULL ) | 45 | getfunc( WSAStartup ); |
12 | { | 46 | getfunc( WSACleanup ); |
13 | FNDEF_DYN_WSAStartup fn = (FNDEF_DYN_WSAStartup) | 47 | getfunc( WSAGetLastError ); |
14 | GetProcAddress( Ws2_32, "WSAStartup" ); | 48 | getfunc( inet_ntoa ); |
15 | if( fn != NULL ) | 49 | getfunc( inet_addr ); |
16 | out = (fn)(wVersionRequested,lpWSAData); | 50 | getfunc( select ); |
17 | } | 51 | getfunc( socket ); |
18 | return out; | 52 | getfunc( ioctlsocket ); |
19 | } | 53 | getfunc( htons ); |
54 | getfunc( htonl ); | ||
55 | getfunc( gethostbyname ); | ||
56 | getfunc( freeaddrinfo ); | ||
57 | getfunc( getaddrinfo ); | ||
58 | getfunc( connect ); | ||
59 | getfunc( getpeername ); | ||
60 | getfunc( setsockopt ); | ||
61 | getfunc( bind ); | ||
62 | getfunc( listen ); | ||
63 | getfunc( accept ); | ||
64 | getfunc( recv ); | ||
65 | getfunc( send ); | ||
66 | getfunc( __WSAFDIsSet ); | ||
20 | 67 | ||
21 | typedef int (__cdecl *FNDEF_DYN_WSACleanup)(); | 68 | Bu::Winsock2::WSAStartup( MAKEWORD(2, 2), &wsaData ); |
22 | int DynamicWinsock2::WSACleanup() | ||
23 | { | ||
24 | int out=0; | ||
25 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("WS2_32.DLL")); | ||
26 | if( Ws2_32 != NULL ) | ||
27 | { | ||
28 | FNDEF_DYN_WSACleanup fn = (FNDEF_DYN_WSACleanup) | ||
29 | GetProcAddress( Ws2_32, "WSACleanup" ); | ||
30 | if( fn != NULL ) | ||
31 | out = (fn)(); | ||
32 | } | ||
33 | return out; | ||
34 | } | 69 | } |
35 | 70 | ||
36 | //typedef char * (__cdecl *FNDEF_DYN_gai_strerrorA)( int ecode ); | 71 | Bu::Winsock2::~Winsock2() |
37 | typedef int (__cdecl *FNDEF_DYN_WSAGetLastError)(void); | ||
38 | int DynamicWinsock2::WSAGetLastError() | ||
39 | { | 72 | { |
40 | int out=0; | 73 | Bu::Winsock2::WSACleanup(); |
41 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("WS2_32.DLL")); | 74 | FreeLibrary( Ws2_32 ); |
42 | if( Ws2_32 != NULL ) | ||
43 | { | ||
44 | FNDEF_DYN_WSAGetLastError fn = (FNDEF_DYN_WSAGetLastError) | ||
45 | GetProcAddress( Ws2_32, "WSAGetLastError" ); | ||
46 | if( fn != NULL ) | ||
47 | out = (fn)(); | ||
48 | } | ||
49 | return out; | ||
50 | } | 75 | } |
51 | 76 | ||
52 | typedef char * (__cdecl *FNDEF_DYN_inet_ntoa)( struct in_addr ); | 77 | char *Bu::Winsock2::gai_strerror( int iCode ) |
53 | void DynamicWinsock2::inet_ntoa( Bu::FString &out, struct in_addr addr_in ) | ||
54 | { | 78 | { |
55 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | 79 | sprintf( scode, "%d", Bu::Winsock2::WSAGetLastError() ); |
56 | if( Ws2_32 != NULL ) | 80 | return scode; |
57 | { | ||
58 | FNDEF_DYN_inet_ntoa fn = (FNDEF_DYN_inet_ntoa) | ||
59 | GetProcAddress( Ws2_32, "inet_ntoa" ); | ||
60 | if( fn != NULL ) | ||
61 | out = (fn)( addr_in ); | ||
62 | |||
63 | //We will let windows clean up our dll imports on exit | ||
64 | //FreeLibrary( Ws2_32 ); | ||
65 | } | ||
66 | } | 81 | } |
67 | 82 | ||
68 | typedef unsigned long (__cdecl *FNDEF_DYN_inet_addr)( const char * ); | 83 | int Bu::Winsock2::WSAStartup( WORD a, LPWSADATA b ) { |
69 | unsigned long DynamicWinsock2::inet_addr( const char *s_in ) | 84 | return (*Bu::Winsock2::_fnptr_WSAStartup)( a, b ); |
70 | { | ||
71 | unsigned long out = 0; | ||
72 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
73 | if( Ws2_32 != NULL ) | ||
74 | { | ||
75 | FNDEF_DYN_inet_addr fn = (FNDEF_DYN_inet_addr) | ||
76 | GetProcAddress( Ws2_32, "inet_addr" ); | ||
77 | if( fn != NULL ) | ||
78 | out = (fn)( s_in ); | ||
79 | } | ||
80 | return out; | ||
81 | } | 85 | } |
82 | 86 | int Bu::Winsock2::WSACleanup( ) { | |
83 | typedef int (__cdecl *FNDEF_DYN_select)( | 87 | return (*Bu::Winsock2::_fnptr_WSACleanup)(); |
84 | int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*); | ||
85 | int DynamicWinsock2::select(int nfds, fd_set *readfds, fd_set *writefds, | ||
86 | fd_set *exceptfds, const struct timeval *timeout) | ||
87 | { | ||
88 | int out = 0; | ||
89 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
90 | if( Ws2_32 != NULL ) | ||
91 | { | ||
92 | FNDEF_DYN_select fn = (FNDEF_DYN_select) | ||
93 | GetProcAddress( Ws2_32, "select" ); | ||
94 | if( fn != NULL ) | ||
95 | out = (fn)( nfds, readfds, writefds, exceptfds, timeout ); | ||
96 | } | ||
97 | return out; | ||
98 | } | 88 | } |
99 | 89 | int Bu::Winsock2::WSAGetLastError( ) { | |
100 | typedef SOCKET (__cdecl *FNDEF_DYN_socket)(int,int,int); | 90 | return (*Bu::Winsock2::_fnptr_WSAGetLastError)(); |
101 | SOCKET DynamicWinsock2::socket(int domain, int type, int protocol) | ||
102 | { | ||
103 | SOCKET out = 0; | ||
104 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
105 | if( Ws2_32 != NULL ) | ||
106 | { | ||
107 | FNDEF_DYN_socket fn = (FNDEF_DYN_socket) | ||
108 | GetProcAddress( Ws2_32, "socket" ); | ||
109 | if( fn != NULL ) | ||
110 | out = (fn)( domain, type, protocol ); | ||
111 | } | ||
112 | return out; | ||
113 | } | 91 | } |
114 | 92 | char * Bu::Winsock2::inet_ntoa( struct in_addr a ) { | |
115 | typedef int (__cdecl *FNDEF_DYN_ioctlsocket)(SOCKET,long,u_long *); | 93 | return (*Bu::Winsock2::_fnptr_inet_ntoa)( a ); |
116 | int DynamicWinsock2::ioctlsocket(SOCKET s, long cmd, u_long *argp) | ||
117 | { | ||
118 | int out = 0; | ||
119 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
120 | if( Ws2_32 != NULL ) | ||
121 | { | ||
122 | FNDEF_DYN_ioctlsocket fn = (FNDEF_DYN_ioctlsocket) | ||
123 | GetProcAddress( Ws2_32, "ioctlsocket" ); | ||
124 | if( fn != NULL ) | ||
125 | out = (fn)( s, cmd, argp ); | ||
126 | } | ||
127 | return out; | ||
128 | } | 94 | } |
129 | 95 | unsigned long Bu::Winsock2::inet_addr( const char *s_in ) { | |
130 | typedef u_short (__cdecl *FNDEF_DYN_htons)(u_short); | 96 | return (*Bu::Winsock2::_fnptr_inet_addr)( s_in ); |
131 | u_short DynamicWinsock2::htons(u_short in) | ||
132 | { | ||
133 | u_short out = 0; | ||
134 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
135 | if( Ws2_32 != NULL ) | ||
136 | { | ||
137 | FNDEF_DYN_htons fn = (FNDEF_DYN_htons) | ||
138 | GetProcAddress( Ws2_32, "htons" ); | ||
139 | if( fn != NULL ) | ||
140 | out = (fn)( in ); | ||
141 | } | ||
142 | return out; | ||
143 | } | 97 | } |
144 | 98 | int Bu::Winsock2::select( int a, fd_set *b, fd_set *c, fd_set *d, | |
145 | typedef u_long (__cdecl *FNDEF_DYN_htonl)(u_long); | 99 | const struct timeval *e ) { |
146 | u_long DynamicWinsock2::htonl(u_long in) | 100 | return (*Bu::Winsock2::_fnptr_select)( a, b, c, d, e ); |
147 | { | ||
148 | u_long out = 0; | ||
149 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
150 | if( Ws2_32 != NULL ) | ||
151 | { | ||
152 | FNDEF_DYN_htonl fn = (FNDEF_DYN_htonl) | ||
153 | GetProcAddress( Ws2_32, "htonl" ); | ||
154 | if( fn != NULL ) | ||
155 | out = (fn)( in ); | ||
156 | } | ||
157 | return out; | ||
158 | } | 101 | } |
159 | 102 | SOCKET Bu::Winsock2::socket( int domain, int type, int protocol ) { | |
160 | typedef struct hostent * (__cdecl *FNDEF_DYN_gethostbyname)(const char *); | 103 | return (*Bu::Winsock2::_fnptr_socket)( domain, type, protocol ); |
161 | struct hostent *DynamicWinsock2::gethostbyname(const char *name) | ||
162 | { | ||
163 | hostent *out = NULL; | ||
164 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
165 | if( Ws2_32 != NULL ) | ||
166 | { | ||
167 | FNDEF_DYN_gethostbyname fn = (FNDEF_DYN_gethostbyname) | ||
168 | GetProcAddress( Ws2_32, "gethostbyname" ); | ||
169 | if( fn != NULL ) | ||
170 | out = (fn)( name ); | ||
171 | } | ||
172 | return out; | ||
173 | } | 104 | } |
174 | 105 | int Bu::Winsock2::ioctlsocket( SOCKET s, long cmd, u_long *argp ) { | |
175 | typedef void (__cdecl *FNDEF_DYN_freeaddrinfo)(struct addrinfo *); | 106 | return (*Bu::Winsock2::_fnptr_ioctlsocket)( s, cmd, argp ); |
176 | void DynamicWinsock2::freeaddrinfo(struct addrinfo *ai) | ||
177 | { | ||
178 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
179 | if( Ws2_32 != NULL ) | ||
180 | { | ||
181 | FNDEF_DYN_freeaddrinfo fn = (FNDEF_DYN_freeaddrinfo) | ||
182 | GetProcAddress( Ws2_32, "freeaddrinfo" ); | ||
183 | if( fn != NULL ) | ||
184 | (fn)( ai ); | ||
185 | } | ||
186 | } | 107 | } |
187 | 108 | u_short Bu::Winsock2::htons( u_short in ) { | |
188 | typedef int (__cdecl *FNDEF_DYN_getaddrinfo)( | 109 | return (*Bu::Winsock2::_fnptr_htons)( in ); |
189 | const char*,const char*,const struct addrinfo*,struct addrinfo**); | 110 | } |
190 | int DynamicWinsock2::getaddrinfo( | 111 | u_long Bu::Winsock2::htonl( u_long in ) { |
191 | const char *nodename, const char *servname, | 112 | return (*Bu::Winsock2::_fnptr_htonl)( in ); |
192 | const struct addrinfo *hints, struct addrinfo **res ) | ||
193 | { | ||
194 | int out = 0; | ||
195 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
196 | if( Ws2_32 != NULL ) | ||
197 | { | ||
198 | FNDEF_DYN_getaddrinfo fn = (FNDEF_DYN_getaddrinfo) | ||
199 | GetProcAddress( Ws2_32, "getaddrinfo" ); | ||
200 | if( fn != NULL ) | ||
201 | out = (fn)( nodename, servname, hints, res ); | ||
202 | } | ||
203 | return out; | ||
204 | } | 113 | } |
205 | 114 | struct hostent * Bu::Winsock2::gethostbyname( const char *name ) { | |
206 | typedef int (__cdecl *FNDEF_DYN_connect)(SOCKET,const struct sockaddr*,int); | 115 | return (*Bu::Winsock2::_fnptr_gethostbyname)( name ); |
207 | int DynamicWinsock2::connect( | ||
208 | SOCKET s, const struct sockaddr *serv_addr, int addrlen) | ||
209 | { | ||
210 | int out = 0; | ||
211 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
212 | if( Ws2_32 != NULL ) | ||
213 | { | ||
214 | FNDEF_DYN_connect fn = (FNDEF_DYN_connect) | ||
215 | GetProcAddress( Ws2_32, "connect" ); | ||
216 | if( fn != NULL ) | ||
217 | out = (fn)( s, serv_addr, addrlen ); | ||
218 | } | ||
219 | return out; | ||
220 | } | 116 | } |
221 | 117 | void Bu::Winsock2::freeaddrinfo( struct addrinfo *ai ) { | |
222 | typedef int (__cdecl *FNDEF_DYN_getpeername)(SOCKET,struct sockaddr*,int*); | 118 | return (*Bu::Winsock2::_fnptr_freeaddrinfo)( ai ); |
223 | int DynamicWinsock2::getpeername(SOCKET s, struct sockaddr *name, int *namelen) | ||
224 | { | ||
225 | int out = 0; | ||
226 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
227 | if( Ws2_32 != NULL ) | ||
228 | { | ||
229 | FNDEF_DYN_getpeername fn = (FNDEF_DYN_getpeername) | ||
230 | GetProcAddress( Ws2_32, "getpeername" ); | ||
231 | if( fn != NULL ) | ||
232 | out = (fn)( s, name, namelen ); | ||
233 | } | ||
234 | return out; | ||
235 | } | 119 | } |
236 | 120 | int Bu::Winsock2::getaddrinfo( const char *a, const char *b, | |
237 | typedef int (__cdecl *FNDEF_DYN_setsockopt)(SOCKET,int,int,const char*,int); | 121 | const struct addrinfo *c, struct addrinfo **d ) { |
238 | int DynamicWinsock2::setsockopt(SOCKET s, int level, int optname, | 122 | return (*Bu::Winsock2::_fnptr_getaddrinfo)( a, b, c, d ); |
239 | const char *optval, int optlen) | ||
240 | { | ||
241 | int out = 0; | ||
242 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
243 | if( Ws2_32 != NULL ) | ||
244 | { | ||
245 | FNDEF_DYN_setsockopt fn = (FNDEF_DYN_setsockopt) | ||
246 | GetProcAddress( Ws2_32, "setsockopt" ); | ||
247 | if( fn != NULL ) | ||
248 | out = (fn)( s, level, optname, optval, optlen ); | ||
249 | } | ||
250 | return out; | ||
251 | } | 123 | } |
252 | 124 | int Bu::Winsock2::connect( SOCKET s, const struct sockaddr *a, int b ) { | |
253 | typedef int (__cdecl *FNDEF_DYN_bind)(SOCKET,const struct sockaddr*,int); | 125 | return (*Bu::Winsock2::_fnptr_connect)( s, a, b ); |
254 | int DynamicWinsock2::bind(SOCKET s, const struct sockaddr *my_addr, int addrlen) | ||
255 | { | ||
256 | int out = 0; | ||
257 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
258 | if( Ws2_32 != NULL ) | ||
259 | { | ||
260 | FNDEF_DYN_bind fn = (FNDEF_DYN_bind) | ||
261 | GetProcAddress( Ws2_32, "bind" ); | ||
262 | if( fn != NULL ) | ||
263 | out = (fn)( s, my_addr, addrlen ); | ||
264 | } | ||
265 | return out; | ||
266 | } | 126 | } |
267 | 127 | int Bu::Winsock2::getpeername( SOCKET s, struct sockaddr *a, int *b ) { | |
268 | typedef int (__cdecl *FNDEF_DYN_listen)(SOCKET,int); | 128 | return (*Bu::Winsock2::_fnptr_getpeername)( s, a, b); |
269 | int DynamicWinsock2::listen(SOCKET s, int backlog) | ||
270 | { | ||
271 | int out = 0; | ||
272 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
273 | if( Ws2_32 != NULL ) | ||
274 | { | ||
275 | FNDEF_DYN_listen fn = (FNDEF_DYN_listen) | ||
276 | GetProcAddress( Ws2_32, "listen" ); | ||
277 | if( fn != NULL ) | ||
278 | out = (fn)( s, backlog ); | ||
279 | } | ||
280 | return out; | ||
281 | } | 129 | } |
282 | 130 | int Bu::Winsock2::setsockopt( SOCKET s, int a, int b, | |
283 | typedef SOCKET (__cdecl *FNDEF_DYN_accept)(SOCKET,struct sockaddr*,int*); | 131 | const char *c, int d ) { |
284 | SOCKET DynamicWinsock2::accept(SOCKET s, struct sockaddr *addr, int *addrlen) | 132 | return (*Bu::Winsock2::_fnptr_setsockopt)( s, a, b, c, d ); |
285 | { | ||
286 | SOCKET out = 0; | ||
287 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
288 | if( Ws2_32 != NULL ) | ||
289 | { | ||
290 | FNDEF_DYN_accept fn = (FNDEF_DYN_accept) | ||
291 | GetProcAddress( Ws2_32, "accept" ); | ||
292 | if( fn != NULL ) | ||
293 | out = (fn)( s, addr, addrlen ); | ||
294 | } | ||
295 | return out; | ||
296 | } | 133 | } |
297 | 134 | int Bu::Winsock2::bind( SOCKET s, const struct sockaddr *a, int b ) { | |
298 | typedef int (__cdecl *FNDEF_DYN_recv)(SOCKET,char*,int,int); | 135 | return (*Bu::Winsock2::_fnptr_bind)( s, a, b ); |
299 | int DynamicWinsock2::recv( SOCKET s, char *buf, int len, int flags ) | ||
300 | { | ||
301 | int out = 0; | ||
302 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
303 | if( Ws2_32 != NULL ) | ||
304 | { | ||
305 | FNDEF_DYN_recv fn = (FNDEF_DYN_recv) | ||
306 | GetProcAddress( Ws2_32, "recv" ); | ||
307 | if( fn != NULL ) | ||
308 | out = (fn)( s, buf, len, flags ); | ||
309 | } | ||
310 | return out; | ||
311 | } | 136 | } |
312 | 137 | int Bu::Winsock2::listen( SOCKET s, int backlog ) { | |
313 | typedef int (__cdecl *FNDEF_DYN_send)(SOCKET,const char*,int,int); | 138 | return (*Bu::Winsock2::_fnptr_listen)( s, backlog ); |
314 | int DynamicWinsock2::send( SOCKET s, const char *buf, int len, int flags ) | ||
315 | { | ||
316 | int out = 0; | ||
317 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
318 | if( Ws2_32 != NULL ) | ||
319 | { | ||
320 | FNDEF_DYN_send fn = (FNDEF_DYN_send) | ||
321 | GetProcAddress( Ws2_32, "send" ); | ||
322 | if( fn != NULL ) | ||
323 | out = (fn)( s, buf, len, flags ); | ||
324 | } | ||
325 | return out; | ||
326 | } | 139 | } |
327 | 140 | SOCKET Bu::Winsock2::accept( SOCKET s, struct sockaddr *a, int *b ) { | |
328 | typedef int (__cdecl *FNDEF_DYN__WSAFDIsSet)(SOCKET,fd_set*); | 141 | return (*Bu::Winsock2::_fnptr_accept)( s, a, b ); |
329 | int DynamicWinsock2::DYN_FD_ISSET(SOCKET s, fd_set *set) | ||
330 | { | ||
331 | int out = 0; | ||
332 | HINSTANCE Ws2_32 = LoadLibrary(TEXT("Ws2_32")); | ||
333 | if( Ws2_32 != NULL ) | ||
334 | { | ||
335 | FNDEF_DYN__WSAFDIsSet fn = (FNDEF_DYN__WSAFDIsSet) | ||
336 | GetProcAddress( Ws2_32, "__WSAFDIsSet" ); | ||
337 | if( fn != NULL ) | ||
338 | out = (fn)( s, set ); | ||
339 | } | ||
340 | return out; | ||
341 | } | 142 | } |
342 | 143 | int Bu::Winsock2::recv( SOCKET s, char *buf, int len, int flags ) { | |
343 | DynamicWinsock2::Winsock2::Winsock2() | 144 | return (*Bu::Winsock2::_fnptr_recv)( s, buf, len, flags ); |
344 | { | ||
345 | DynamicWinsock2::WSAStartup( MAKEWORD(2, 2), &wsaData ); | ||
346 | } | 145 | } |
347 | 146 | int Bu::Winsock2::send( SOCKET s, const char *buf, int len, int flags ) { | |
348 | DynamicWinsock2::Winsock2::~Winsock2() | 147 | return (*Bu::Winsock2::_fnptr_send)( s, buf, len, flags ); |
349 | { | 148 | } |
350 | DynamicWinsock2::WSACleanup(); | 149 | int Bu::Winsock2::__WSAFDIsSet( SOCKET s, fd_set *set ) { |
150 | return (*Bu::Winsock2::_fnptr___WSAFDIsSet)( s, set ); | ||
351 | } | 151 | } |
352 | 152 | ||
353 | #endif | 153 | #endif |