aboutsummaryrefslogtreecommitdiff
path: root/src/wsocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wsocket.c')
-rwxr-xr-xsrc/wsocket.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/src/wsocket.c b/src/wsocket.c
index c281058..1da984c 100755
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -12,13 +12,17 @@
12#include "socket.h" 12#include "socket.h"
13#include "pierror.h" 13#include "pierror.h"
14 14
15#ifndef _WIN32
16#pragma GCC visibility push(hidden)
17#endif
18
15/* WinSock doesn't have a strerror... */ 19/* WinSock doesn't have a strerror... */
16static const char *wstrerror(int err); 20static const char *wstrerror(int err);
17 21
18/*-------------------------------------------------------------------------*\ 22/*-------------------------------------------------------------------------*\
19* Initializes module 23* Initializes module
20\*-------------------------------------------------------------------------*/ 24\*-------------------------------------------------------------------------*/
21LUASOCKET_PRIVATE int socket_open(void) { 25int socket_open(void) {
22 WSADATA wsaData; 26 WSADATA wsaData;
23 WORD wVersionRequested = MAKEWORD(2, 0); 27 WORD wVersionRequested = MAKEWORD(2, 0);
24 int err = WSAStartup(wVersionRequested, &wsaData ); 28 int err = WSAStartup(wVersionRequested, &wsaData );
@@ -34,7 +38,7 @@ LUASOCKET_PRIVATE int socket_open(void) {
34/*-------------------------------------------------------------------------*\ 38/*-------------------------------------------------------------------------*\
35* Close module 39* Close module
36\*-------------------------------------------------------------------------*/ 40\*-------------------------------------------------------------------------*/
37LUASOCKET_PRIVATE int socket_close(void) { 41int socket_close(void) {
38 WSACleanup(); 42 WSACleanup();
39 return 1; 43 return 1;
40} 44}
@@ -47,7 +51,7 @@ LUASOCKET_PRIVATE int socket_close(void) {
47#define WAITFD_E 4 51#define WAITFD_E 4
48#define WAITFD_C (WAITFD_E|WAITFD_W) 52#define WAITFD_C (WAITFD_E|WAITFD_W)
49 53
50LUASOCKET_PRIVATE int socket_waitfd(p_socket ps, int sw, p_timeout tm) { 54int socket_waitfd(p_socket ps, int sw, p_timeout tm) {
51 int ret; 55 int ret;
52 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; 56 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL;
53 struct timeval tv, *tp = NULL; 57 struct timeval tv, *tp = NULL;
@@ -75,7 +79,7 @@ LUASOCKET_PRIVATE int socket_waitfd(p_socket ps, int sw, p_timeout tm) {
75/*-------------------------------------------------------------------------*\ 79/*-------------------------------------------------------------------------*\
76* Select with int timeout in ms 80* Select with int timeout in ms
77\*-------------------------------------------------------------------------*/ 81\*-------------------------------------------------------------------------*/
78LUASOCKET_PRIVATE int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds, 82int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds,
79 p_timeout tm) { 83 p_timeout tm) {
80 struct timeval tv; 84 struct timeval tv;
81 double t = timeout_get(tm); 85 double t = timeout_get(tm);
@@ -90,7 +94,7 @@ LUASOCKET_PRIVATE int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_s
90/*-------------------------------------------------------------------------*\ 94/*-------------------------------------------------------------------------*\
91* Close and inutilize socket 95* Close and inutilize socket
92\*-------------------------------------------------------------------------*/ 96\*-------------------------------------------------------------------------*/
93LUASOCKET_PRIVATE void socket_destroy(p_socket ps) { 97void socket_destroy(p_socket ps) {
94 if (*ps != SOCKET_INVALID) { 98 if (*ps != SOCKET_INVALID) {
95 socket_setblocking(ps); /* close can take a long time on WIN32 */ 99 socket_setblocking(ps); /* close can take a long time on WIN32 */
96 closesocket(*ps); 100 closesocket(*ps);
@@ -101,7 +105,7 @@ LUASOCKET_PRIVATE void socket_destroy(p_socket ps) {
101/*-------------------------------------------------------------------------*\ 105/*-------------------------------------------------------------------------*\
102* 106*
103\*-------------------------------------------------------------------------*/ 107\*-------------------------------------------------------------------------*/
104LUASOCKET_PRIVATE void socket_shutdown(p_socket ps, int how) { 108void socket_shutdown(p_socket ps, int how) {
105 socket_setblocking(ps); 109 socket_setblocking(ps);
106 shutdown(*ps, how); 110 shutdown(*ps, how);
107 socket_setnonblocking(ps); 111 socket_setnonblocking(ps);
@@ -110,7 +114,7 @@ LUASOCKET_PRIVATE void socket_shutdown(p_socket ps, int how) {
110/*-------------------------------------------------------------------------*\ 114/*-------------------------------------------------------------------------*\
111* Creates and sets up a socket 115* Creates and sets up a socket
112\*-------------------------------------------------------------------------*/ 116\*-------------------------------------------------------------------------*/
113LUASOCKET_PRIVATE int socket_create(p_socket ps, int domain, int type, int protocol) { 117int socket_create(p_socket ps, int domain, int type, int protocol) {
114 *ps = socket(domain, type, protocol); 118 *ps = socket(domain, type, protocol);
115 if (*ps != SOCKET_INVALID) return IO_DONE; 119 if (*ps != SOCKET_INVALID) return IO_DONE;
116 else return WSAGetLastError(); 120 else return WSAGetLastError();
@@ -119,7 +123,7 @@ LUASOCKET_PRIVATE int socket_create(p_socket ps, int domain, int type, int proto
119/*-------------------------------------------------------------------------*\ 123/*-------------------------------------------------------------------------*\
120* Connects or returns error message 124* Connects or returns error message
121\*-------------------------------------------------------------------------*/ 125\*-------------------------------------------------------------------------*/
122LUASOCKET_PRIVATE int socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) { 126int socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) {
123 int err; 127 int err;
124 /* don't call on closed socket */ 128 /* don't call on closed socket */
125 if (*ps == SOCKET_INVALID) return IO_CLOSED; 129 if (*ps == SOCKET_INVALID) return IO_CLOSED;
@@ -148,7 +152,7 @@ LUASOCKET_PRIVATE int socket_connect(p_socket ps, SA *addr, socklen_t len, p_tim
148/*-------------------------------------------------------------------------*\ 152/*-------------------------------------------------------------------------*\
149* Binds or returns error message 153* Binds or returns error message
150\*-------------------------------------------------------------------------*/ 154\*-------------------------------------------------------------------------*/
151LUASOCKET_PRIVATE int socket_bind(p_socket ps, SA *addr, socklen_t len) { 155int socket_bind(p_socket ps, SA *addr, socklen_t len) {
152 int err = IO_DONE; 156 int err = IO_DONE;
153 socket_setblocking(ps); 157 socket_setblocking(ps);
154 if (bind(*ps, addr, len) < 0) err = WSAGetLastError(); 158 if (bind(*ps, addr, len) < 0) err = WSAGetLastError();
@@ -159,7 +163,7 @@ LUASOCKET_PRIVATE int socket_bind(p_socket ps, SA *addr, socklen_t len) {
159/*-------------------------------------------------------------------------*\ 163/*-------------------------------------------------------------------------*\
160* 164*
161\*-------------------------------------------------------------------------*/ 165\*-------------------------------------------------------------------------*/
162LUASOCKET_PRIVATE int socket_listen(p_socket ps, int backlog) { 166int socket_listen(p_socket ps, int backlog) {
163 int err = IO_DONE; 167 int err = IO_DONE;
164 socket_setblocking(ps); 168 socket_setblocking(ps);
165 if (listen(*ps, backlog) < 0) err = WSAGetLastError(); 169 if (listen(*ps, backlog) < 0) err = WSAGetLastError();
@@ -170,7 +174,7 @@ LUASOCKET_PRIVATE int socket_listen(p_socket ps, int backlog) {
170/*-------------------------------------------------------------------------*\ 174/*-------------------------------------------------------------------------*\
171* Accept with timeout 175* Accept with timeout
172\*-------------------------------------------------------------------------*/ 176\*-------------------------------------------------------------------------*/
173LUASOCKET_PRIVATE int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, 177int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len,
174 p_timeout tm) { 178 p_timeout tm) {
175 if (*ps == SOCKET_INVALID) return IO_CLOSED; 179 if (*ps == SOCKET_INVALID) return IO_CLOSED;
176 for ( ;; ) { 180 for ( ;; ) {
@@ -192,7 +196,7 @@ LUASOCKET_PRIVATE int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_
192* this can take an awful lot of time and we will end up blocked. 196* this can take an awful lot of time and we will end up blocked.
193* Therefore, whoever calls this function should not pass a huge buffer. 197* Therefore, whoever calls this function should not pass a huge buffer.
194\*-------------------------------------------------------------------------*/ 198\*-------------------------------------------------------------------------*/
195LUASOCKET_PRIVATE int socket_send(p_socket ps, const char *data, size_t count, 199int socket_send(p_socket ps, const char *data, size_t count,
196 size_t *sent, p_timeout tm) 200 size_t *sent, p_timeout tm)
197{ 201{
198 int err; 202 int err;
@@ -220,7 +224,7 @@ LUASOCKET_PRIVATE int socket_send(p_socket ps, const char *data, size_t count,
220/*-------------------------------------------------------------------------*\ 224/*-------------------------------------------------------------------------*\
221* Sendto with timeout 225* Sendto with timeout
222\*-------------------------------------------------------------------------*/ 226\*-------------------------------------------------------------------------*/
223LUASOCKET_PRIVATE int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, 227int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,
224 SA *addr, socklen_t len, p_timeout tm) 228 SA *addr, socklen_t len, p_timeout tm)
225{ 229{
226 int err; 230 int err;
@@ -241,7 +245,7 @@ LUASOCKET_PRIVATE int socket_sendto(p_socket ps, const char *data, size_t count,
241/*-------------------------------------------------------------------------*\ 245/*-------------------------------------------------------------------------*\
242* Receive with timeout 246* Receive with timeout
243\*-------------------------------------------------------------------------*/ 247\*-------------------------------------------------------------------------*/
244LUASOCKET_PRIVATE int socket_recv(p_socket ps, char *data, size_t count, size_t *got, 248int socket_recv(p_socket ps, char *data, size_t count, size_t *got,
245 p_timeout tm) 249 p_timeout tm)
246{ 250{
247 int err, prev = IO_DONE; 251 int err, prev = IO_DONE;
@@ -270,7 +274,7 @@ LUASOCKET_PRIVATE int socket_recv(p_socket ps, char *data, size_t count, size_t
270/*-------------------------------------------------------------------------*\ 274/*-------------------------------------------------------------------------*\
271* Recvfrom with timeout 275* Recvfrom with timeout
272\*-------------------------------------------------------------------------*/ 276\*-------------------------------------------------------------------------*/
273LUASOCKET_PRIVATE int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, 277int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
274 SA *addr, socklen_t *len, p_timeout tm) 278 SA *addr, socklen_t *len, p_timeout tm)
275{ 279{
276 int err, prev = IO_DONE; 280 int err, prev = IO_DONE;
@@ -299,7 +303,7 @@ LUASOCKET_PRIVATE int socket_recvfrom(p_socket ps, char *data, size_t count, siz
299/*-------------------------------------------------------------------------*\ 303/*-------------------------------------------------------------------------*\
300* Put socket into blocking mode 304* Put socket into blocking mode
301\*-------------------------------------------------------------------------*/ 305\*-------------------------------------------------------------------------*/
302LUASOCKET_PRIVATE void socket_setblocking(p_socket ps) { 306void socket_setblocking(p_socket ps) {
303 u_long argp = 0; 307 u_long argp = 0;
304 ioctlsocket(*ps, FIONBIO, &argp); 308 ioctlsocket(*ps, FIONBIO, &argp);
305} 309}
@@ -307,7 +311,7 @@ LUASOCKET_PRIVATE void socket_setblocking(p_socket ps) {
307/*-------------------------------------------------------------------------*\ 311/*-------------------------------------------------------------------------*\
308* Put socket into non-blocking mode 312* Put socket into non-blocking mode
309\*-------------------------------------------------------------------------*/ 313\*-------------------------------------------------------------------------*/
310LUASOCKET_PRIVATE void socket_setnonblocking(p_socket ps) { 314void socket_setnonblocking(p_socket ps) {
311 u_long argp = 1; 315 u_long argp = 1;
312 ioctlsocket(*ps, FIONBIO, &argp); 316 ioctlsocket(*ps, FIONBIO, &argp);
313} 317}
@@ -315,13 +319,13 @@ LUASOCKET_PRIVATE void socket_setnonblocking(p_socket ps) {
315/*-------------------------------------------------------------------------*\ 319/*-------------------------------------------------------------------------*\
316* DNS helpers 320* DNS helpers
317\*-------------------------------------------------------------------------*/ 321\*-------------------------------------------------------------------------*/
318LUASOCKET_PRIVATE int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) { 322int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) {
319 *hp = gethostbyaddr(addr, len, AF_INET); 323 *hp = gethostbyaddr(addr, len, AF_INET);
320 if (*hp) return IO_DONE; 324 if (*hp) return IO_DONE;
321 else return WSAGetLastError(); 325 else return WSAGetLastError();
322} 326}
323 327
324LUASOCKET_PRIVATE int socket_gethostbyname(const char *addr, struct hostent **hp) { 328int socket_gethostbyname(const char *addr, struct hostent **hp) {
325 *hp = gethostbyname(addr); 329 *hp = gethostbyname(addr);
326 if (*hp) return IO_DONE; 330 if (*hp) return IO_DONE;
327 else return WSAGetLastError(); 331 else return WSAGetLastError();
@@ -330,7 +334,7 @@ LUASOCKET_PRIVATE int socket_gethostbyname(const char *addr, struct hostent **hp
330/*-------------------------------------------------------------------------*\ 334/*-------------------------------------------------------------------------*\
331* Error translation functions 335* Error translation functions
332\*-------------------------------------------------------------------------*/ 336\*-------------------------------------------------------------------------*/
333LUASOCKET_PRIVATE const char *socket_hoststrerror(int err) { 337const char *socket_hoststrerror(int err) {
334 if (err <= 0) return io_strerror(err); 338 if (err <= 0) return io_strerror(err);
335 switch (err) { 339 switch (err) {
336 case WSAHOST_NOT_FOUND: return PIE_HOST_NOT_FOUND; 340 case WSAHOST_NOT_FOUND: return PIE_HOST_NOT_FOUND;
@@ -338,7 +342,7 @@ LUASOCKET_PRIVATE const char *socket_hoststrerror(int err) {
338 } 342 }
339} 343}
340 344
341LUASOCKET_PRIVATE const char *socket_strerror(int err) { 345const char *socket_strerror(int err) {
342 if (err <= 0) return io_strerror(err); 346 if (err <= 0) return io_strerror(err);
343 switch (err) { 347 switch (err) {
344 case WSAEADDRINUSE: return PIE_ADDRINUSE; 348 case WSAEADDRINUSE: return PIE_ADDRINUSE;
@@ -352,12 +356,12 @@ LUASOCKET_PRIVATE const char *socket_strerror(int err) {
352 } 356 }
353} 357}
354 358
355LUASOCKET_PRIVATE const char *socket_ioerror(p_socket ps, int err) { 359const char *socket_ioerror(p_socket ps, int err) {
356 (void) ps; 360 (void) ps;
357 return socket_strerror(err); 361 return socket_strerror(err);
358} 362}
359 363
360LUASOCKET_PRIVATE static const char *wstrerror(int err) { 364static const char *wstrerror(int err) {
361 switch (err) { 365 switch (err) {
362 case WSAEINTR: return "Interrupted function call"; 366 case WSAEINTR: return "Interrupted function call";
363 case WSAEACCES: return PIE_ACCESS; // "Permission denied"; 367 case WSAEACCES: return PIE_ACCESS; // "Permission denied";
@@ -406,7 +410,7 @@ LUASOCKET_PRIVATE static const char *wstrerror(int err) {
406 } 410 }
407} 411}
408 412
409LUASOCKET_PRIVATE const char *socket_gaistrerror(int err) { 413const char *socket_gaistrerror(int err) {
410 if (err == 0) return NULL; 414 if (err == 0) return NULL;
411 switch (err) { 415 switch (err) {
412 case EAI_AGAIN: return PIE_AGAIN; 416 case EAI_AGAIN: return PIE_AGAIN;
@@ -433,3 +437,6 @@ LUASOCKET_PRIVATE const char *socket_gaistrerror(int err) {
433 } 437 }
434} 438}
435 439
440#ifndef _WIN32
441#pragma GCC visibility pop
442#endif