aboutsummaryrefslogtreecommitdiff
path: root/src/wsocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wsocket.c')
-rw-r--r--src/wsocket.c88
1 files changed, 65 insertions, 23 deletions
diff --git a/src/wsocket.c b/src/wsocket.c
index 56e65ec..2ce828e 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -1,14 +1,21 @@
1/*=========================================================================*\
2* Socket compatibilization module for Win32
3* LuaSocket toolkit
4*
5* RCS ID: $Id$
6\*=========================================================================*/
1#include <string.h> 7#include <string.h>
2 8
3#include "socket.h" 9#include "socket.h"
4 10
11/*-------------------------------------------------------------------------*\
12* Initializes module
13\*-------------------------------------------------------------------------*/
5int sock_open(void) 14int sock_open(void)
6{ 15{
7 WORD wVersionRequested;
8 WSADATA wsaData; 16 WSADATA wsaData;
9 int err; 17 WORD wVersionRequested = MAKEWORD(2, 0);
10 wVersionRequested = MAKEWORD(2, 0); 18 int err = WSAStartup(wVersionRequested, &wsaData );
11 err = WSAStartup(wVersionRequested, &wsaData );
12 if (err != 0) return 0; 19 if (err != 0) return 0;
13 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) { 20 if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) {
14 WSACleanup(); 21 WSACleanup();
@@ -17,38 +24,58 @@ int sock_open(void)
17 return 1; 24 return 1;
18} 25}
19 26
27/*-------------------------------------------------------------------------*\
28* Close and inutilize socket
29\*-------------------------------------------------------------------------*/
20void sock_destroy(p_sock ps) 30void sock_destroy(p_sock ps)
21{ 31{
22 closesocket(*ps); 32 closesocket(*ps);
33 *ps = SOCK_INVALID;
23} 34}
24 35
36/*-------------------------------------------------------------------------*\
37* Creates and sets up a socket
38\*-------------------------------------------------------------------------*/
25const char *sock_create(p_sock ps, int domain, int type, int protocol) 39const char *sock_create(p_sock ps, int domain, int type, int protocol)
26{ 40{
41 int val = 1;
27 t_sock sock = socket(domain, type, protocol); 42 t_sock sock = socket(domain, type, protocol);
28 if (sock == SOCK_INVALID) return sock_createstrerror(); 43 if (sock == SOCK_INVALID) return sock_createstrerror();
29 *ps = sock; 44 *ps = sock;
30 sock_setnonblocking(ps); 45 sock_setnonblocking(ps);
31 sock_setreuseaddr(ps); 46 setsockopt(*ps, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof(val));
32 return NULL; 47 return NULL;
33} 48}
34 49
50/*-------------------------------------------------------------------------*\
51* Connects or returns error message
52\*-------------------------------------------------------------------------*/
35const char *sock_connect(p_sock ps, SA *addr, socklen_t addr_len) 53const char *sock_connect(p_sock ps, SA *addr, socklen_t addr_len)
36{ 54{
37 if (connect(*ps, addr, addr_len) < 0) return sock_connectstrerror(); 55 if (connect(*ps, addr, addr_len) < 0) return sock_connectstrerror();
38 else return NULL; 56 else return NULL;
39} 57}
40 58
59/*-------------------------------------------------------------------------*\
60* Binds or returns error message
61\*-------------------------------------------------------------------------*/
41const char *sock_bind(p_sock ps, SA *addr, socklen_t addr_len) 62const char *sock_bind(p_sock ps, SA *addr, socklen_t addr_len)
42{ 63{
43 if (bind(*ps, addr, addr_len) < 0) return sock_bindstrerror(); 64 if (bind(*ps, addr, addr_len) < 0) return sock_bindstrerror();
44 else return NULL; 65 else return NULL;
45} 66}
46 67
68/*-------------------------------------------------------------------------*\
69*
70\*-------------------------------------------------------------------------*/
47void sock_listen(p_sock ps, int backlog) 71void sock_listen(p_sock ps, int backlog)
48{ 72{
49 listen(*ps, backlog); 73 listen(*ps, backlog);
50} 74}
51 75
76/*-------------------------------------------------------------------------*\
77* Accept with timeout
78\*-------------------------------------------------------------------------*/
52int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *addr_len, 79int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *addr_len,
53 int timeout) 80 int timeout)
54{ 81{
@@ -70,6 +97,9 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *addr_len,
70 else return IO_DONE; 97 else return IO_DONE;
71} 98}
72 99
100/*-------------------------------------------------------------------------*\
101* Send with timeout
102\*-------------------------------------------------------------------------*/
73int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, 103int sock_send(p_sock ps, const char *data, size_t count, size_t *sent,
74 int timeout) 104 int timeout)
75{ 105{
@@ -104,6 +134,9 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent,
104 } 134 }
105} 135}
106 136
137/*-------------------------------------------------------------------------*\
138* Sendto with timeout
139\*-------------------------------------------------------------------------*/
107int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, 140int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
108 SA *addr, socklen_t addr_len, int timeout) 141 SA *addr, socklen_t addr_len, int timeout)
109{ 142{
@@ -138,6 +171,9 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
138 } 171 }
139} 172}
140 173
174/*-------------------------------------------------------------------------*\
175* Receive with timeout
176\*-------------------------------------------------------------------------*/
141int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) 177int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout)
142{ 178{
143 t_sock sock = *ps; 179 t_sock sock = *ps;
@@ -165,6 +201,9 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout)
165 } 201 }
166} 202}
167 203
204/*-------------------------------------------------------------------------*\
205* Recvfrom with timeout
206\*-------------------------------------------------------------------------*/
168int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, 207int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
169 SA *addr, socklen_t *addr_len, int timeout) 208 SA *addr, socklen_t *addr_len, int timeout)
170{ 209{
@@ -193,6 +232,27 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
193 } 232 }
194} 233}
195 234
235/*-------------------------------------------------------------------------*\
236* Put socket into blocking mode
237\*-------------------------------------------------------------------------*/
238void sock_setblocking(p_sock ps)
239{
240 u_long argp = 0;
241 ioctlsocket(*ps, FIONBIO, &argp);
242}
243
244/*-------------------------------------------------------------------------*\
245* Put socket into non-blocking mode
246\*-------------------------------------------------------------------------*/
247void sock_setnonblocking(p_sock ps)
248{
249 u_long argp = 1;
250 ioctlsocket(*ps, FIONBIO, &argp);
251}
252
253/*-------------------------------------------------------------------------*\
254* Error translation functions
255\*-------------------------------------------------------------------------*/
196const char *sock_hoststrerror(void) 256const char *sock_hoststrerror(void)
197{ 257{
198 switch (WSAGetLastError()) { 258 switch (WSAGetLastError()) {
@@ -241,21 +301,3 @@ const char *sock_connectstrerror(void)
241 default: return "unknown error"; 301 default: return "unknown error";
242 } 302 }
243} 303}
244
245void sock_setreuseaddr(p_sock ps)
246{
247 int val = 1;
248 setsockopt(*ps, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
249}
250
251void sock_setblocking(p_sock ps)
252{
253 u_long argp = 0;
254 ioctlsocket(*ps, FIONBIO, &argp);
255}
256
257void sock_setnonblocking(p_sock ps)
258{
259 u_long argp = 1;
260 ioctlsocket(*ps, FIONBIO, &argp);
261}