aboutsummaryrefslogtreecommitdiff
path: root/src/wsocket.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2005-10-07 04:40:59 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2005-10-07 04:40:59 +0000
commitf4dadea763c1959a27dead24df3ee6c54c209842 (patch)
treec13b294a8ca5438d59b60e3f5a25a4f7c1fc9a1b /src/wsocket.c
parent562d8cceb704a96a7b2f9acc4bc229ab9f5c6541 (diff)
downloadluasocket-f4dadea763c1959a27dead24df3ee6c54c209842.tar.gz
luasocket-f4dadea763c1959a27dead24df3ee6c54c209842.tar.bz2
luasocket-f4dadea763c1959a27dead24df3ee6c54c209842.zip
Before compiling on Windows.
Diffstat (limited to 'src/wsocket.c')
-rw-r--r--src/wsocket.c95
1 files changed, 48 insertions, 47 deletions
diff --git a/src/wsocket.c b/src/wsocket.c
index b533eae..a690dad 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -17,7 +17,7 @@ static const char *wstrerror(int err);
17/*-------------------------------------------------------------------------*\ 17/*-------------------------------------------------------------------------*\
18* Initializes module 18* Initializes module
19\*-------------------------------------------------------------------------*/ 19\*-------------------------------------------------------------------------*/
20int sock_open(void) { 20int socket_open(void) {
21 WSADATA wsaData; 21 WSADATA wsaData;
22 WORD wVersionRequested = MAKEWORD(2, 0); 22 WORD wVersionRequested = MAKEWORD(2, 0);
23 int err = WSAStartup(wVersionRequested, &wsaData ); 23 int err = WSAStartup(wVersionRequested, &wsaData );
@@ -33,7 +33,7 @@ int sock_open(void) {
33/*-------------------------------------------------------------------------*\ 33/*-------------------------------------------------------------------------*\
34* Close module 34* Close module
35\*-------------------------------------------------------------------------*/ 35\*-------------------------------------------------------------------------*/
36int sock_close(void) { 36int socket_close(void) {
37 WSACleanup(); 37 WSACleanup();
38 return 1; 38 return 1;
39} 39}
@@ -46,7 +46,7 @@ int sock_close(void) {
46#define WAITFD_E 4 46#define WAITFD_E 4
47#define WAITFD_C (WAITFD_E|WAITFD_W) 47#define WAITFD_C (WAITFD_E|WAITFD_W)
48 48
49int sock_waitfd(p_sock ps, int sw, p_tm tm) { 49int socket_waitfd(p_socket ps, int sw, p_tm tm) {
50 int ret; 50 int ret;
51 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; 51 fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL;
52 struct timeval tv, *tp = NULL; 52 struct timeval tv, *tp = NULL;
@@ -70,7 +70,7 @@ int sock_waitfd(p_sock ps, int sw, p_tm tm) {
70/*-------------------------------------------------------------------------*\ 70/*-------------------------------------------------------------------------*\
71* Select with int timeout in ms 71* Select with int timeout in ms
72\*-------------------------------------------------------------------------*/ 72\*-------------------------------------------------------------------------*/
73int sock_select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_tm tm) { 73int socket_select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_tm tm) {
74 struct timeval tv; 74 struct timeval tv;
75 double t = tm_get(tm); 75 double t = tm_get(tm);
76 tv.tv_sec = (int) t; 76 tv.tv_sec = (int) t;
@@ -84,39 +84,39 @@ int sock_select(int n, fd_set *rfds, fd_set *wfds, fd_set *efds, p_tm tm) {
84/*-------------------------------------------------------------------------*\ 84/*-------------------------------------------------------------------------*\
85* Close and inutilize socket 85* Close and inutilize socket
86\*-------------------------------------------------------------------------*/ 86\*-------------------------------------------------------------------------*/
87void sock_destroy(p_sock ps) { 87void socket_destroy(p_socket ps) {
88 if (*ps != SOCK_INVALID) { 88 if (*ps != SOCKET_INVALID) {
89 sock_setblocking(ps); /* close can take a long time on WIN32 */ 89 socket_setblocking(ps); /* close can take a long time on WIN32 */
90 closesocket(*ps); 90 closesocket(*ps);
91 *ps = SOCK_INVALID; 91 *ps = SOCKET_INVALID;
92 } 92 }
93} 93}
94 94
95/*-------------------------------------------------------------------------*\ 95/*-------------------------------------------------------------------------*\
96* 96*
97\*-------------------------------------------------------------------------*/ 97\*-------------------------------------------------------------------------*/
98void sock_shutdown(p_sock ps, int how) { 98void socket_shutdown(p_socket ps, int how) {
99 sock_setblocking(ps); 99 socket_setblocking(ps);
100 shutdown(*ps, how); 100 shutdown(*ps, how);
101 sock_setnonblocking(ps); 101 socket_setnonblocking(ps);
102} 102}
103 103
104/*-------------------------------------------------------------------------*\ 104/*-------------------------------------------------------------------------*\
105* Creates and sets up a socket 105* Creates and sets up a socket
106\*-------------------------------------------------------------------------*/ 106\*-------------------------------------------------------------------------*/
107int sock_create(p_sock ps, int domain, int type, int protocol) { 107int socket_create(p_socket ps, int domain, int type, int protocol) {
108 *ps = socket(domain, type, protocol); 108 *ps = socket(domain, type, protocol);
109 if (*ps != SOCK_INVALID) return IO_DONE; 109 if (*ps != SOCKET_INVALID) return IO_DONE;
110 else return WSAGetLastError(); 110 else return WSAGetLastError();
111} 111}
112 112
113/*-------------------------------------------------------------------------*\ 113/*-------------------------------------------------------------------------*\
114* Connects or returns error message 114* Connects or returns error message
115\*-------------------------------------------------------------------------*/ 115\*-------------------------------------------------------------------------*/
116int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) { 116int socket_connect(p_socket ps, SA *addr, socklen_t len, p_tm tm) {
117 int err; 117 int err;
118 /* don't call on closed socket */ 118 /* don't call on closed socket */
119 if (*ps == SOCK_INVALID) return IO_CLOSED; 119 if (*ps == SOCKET_INVALID) return IO_CLOSED;
120 /* ask system to connect */ 120 /* ask system to connect */
121 if (connect(*ps, addr, len) == 0) return IO_DONE; 121 if (connect(*ps, addr, len) == 0) return IO_DONE;
122 /* make sure the system is trying to connect */ 122 /* make sure the system is trying to connect */
@@ -125,13 +125,13 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
125 /* zero timeout case optimization */ 125 /* zero timeout case optimization */
126 if (tm_iszero(tm)) return IO_TIMEOUT; 126 if (tm_iszero(tm)) return IO_TIMEOUT;
127 /* we wait until something happens */ 127 /* we wait until something happens */
128 err = sock_waitfd(ps, WAITFD_C, tm); 128 err = socket_waitfd(ps, WAITFD_C, tm);
129 if (err == IO_CLOSED) { 129 if (err == IO_CLOSED) {
130 int len = sizeof(err); 130 int len = sizeof(err);
131 /* give windows time to set the error (yes, disgusting) */ 131 /* give windows time to set the error (yes, disgusting) */
132 Sleep(10); 132 Sleep(10);
133 /* find out why we failed */ 133 /* find out why we failed */
134 getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); 134 getsockopt(*ps, SOL_SOCKETET, SO_ERROR, (char *)&err, &len);
135 /* we KNOW there was an error. if 'why' is 0, we will return 135 /* we KNOW there was an error. if 'why' is 0, we will return
136 * "unknown error", but it's not really our fault */ 136 * "unknown error", but it's not really our fault */
137 return err > 0? err: IO_UNKNOWN; 137 return err > 0? err: IO_UNKNOWN;
@@ -142,44 +142,44 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) {
142/*-------------------------------------------------------------------------*\ 142/*-------------------------------------------------------------------------*\
143* Binds or returns error message 143* Binds or returns error message
144\*-------------------------------------------------------------------------*/ 144\*-------------------------------------------------------------------------*/
145int sock_bind(p_sock ps, SA *addr, socklen_t len) { 145int socket_bind(p_socket ps, SA *addr, socklen_t len) {
146 int err = IO_DONE; 146 int err = IO_DONE;
147 sock_setblocking(ps); 147 socket_setblocking(ps);
148 if (bind(*ps, addr, len) < 0) err = WSAGetLastError(); 148 if (bind(*ps, addr, len) < 0) err = WSAGetLastError();
149 sock_setnonblocking(ps); 149 socket_setnonblocking(ps);
150 return err; 150 return err;
151} 151}
152 152
153/*-------------------------------------------------------------------------*\ 153/*-------------------------------------------------------------------------*\
154* 154*
155\*-------------------------------------------------------------------------*/ 155\*-------------------------------------------------------------------------*/
156int sock_listen(p_sock ps, int backlog) { 156int socket_listen(p_socket ps, int backlog) {
157 int err = IO_DONE; 157 int err = IO_DONE;
158 sock_setblocking(ps); 158 socket_setblocking(ps);
159 if (listen(*ps, backlog) < 0) err = WSAGetLastError(); 159 if (listen(*ps, backlog) < 0) err = WSAGetLastError();
160 sock_setnonblocking(ps); 160 socket_setnonblocking(ps);
161 return err; 161 return err;
162} 162}
163 163
164/*-------------------------------------------------------------------------*\ 164/*-------------------------------------------------------------------------*\
165* Accept with timeout 165* Accept with timeout
166\*-------------------------------------------------------------------------*/ 166\*-------------------------------------------------------------------------*/
167int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *len, p_tm tm) { 167int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, p_tm tm) {
168 SA daddr; 168 SA daddr;
169 socklen_t dlen = sizeof(daddr); 169 socklen_t dlen = sizeof(daddr);
170 if (*ps == SOCK_INVALID) return IO_CLOSED; 170 if (*ps == SOCKET_INVALID) return IO_CLOSED;
171 if (!addr) addr = &daddr; 171 if (!addr) addr = &daddr;
172 if (!len) len = &dlen; 172 if (!len) len = &dlen;
173 for ( ;; ) { 173 for ( ;; ) {
174 int err; 174 int err;
175 /* try to get client socket */ 175 /* try to get client socket */
176 if ((*pa = accept(*ps, addr, len)) != SOCK_INVALID) return IO_DONE; 176 if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE;
177 /* find out why we failed */ 177 /* find out why we failed */
178 err = WSAGetLastError(); 178 err = WSAGetLastError();
179 /* if we failed because there was no connectoin, keep trying */ 179 /* if we failed because there was no connectoin, keep trying */
180 if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err; 180 if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err;
181 /* call select to avoid busy wait */ 181 /* call select to avoid busy wait */
182 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; 182 if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
183 } 183 }
184 /* can't reach here */ 184 /* can't reach here */
185 return IO_UNKNOWN; 185 return IO_UNKNOWN;
@@ -191,11 +191,12 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *len, p_tm tm) {
191* this can take an awful lot of time and we will end up blocked. 191* this can take an awful lot of time and we will end up blocked.
192* Therefore, whoever calls this function should not pass a huge buffer. 192* Therefore, whoever calls this function should not pass a huge buffer.
193\*-------------------------------------------------------------------------*/ 193\*-------------------------------------------------------------------------*/
194int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm) 194int socket_send(p_socket ps, const char *data, size_t count,
195 size_t *sent, p_tm tm)
195{ 196{
196 int err; 197 int err;
197 /* avoid making system calls on closed sockets */ 198 /* avoid making system calls on closed sockets */
198 if (*ps == SOCK_INVALID) return IO_CLOSED; 199 if (*ps == SOCKET_INVALID) return IO_CLOSED;
199 /* loop until we send something or we give up on error */ 200 /* loop until we send something or we give up on error */
200 *sent = 0; 201 *sent = 0;
201 for ( ;; ) { 202 for ( ;; ) {
@@ -211,7 +212,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm)
211 /* we can only proceed if there was no serious error */ 212 /* we can only proceed if there was no serious error */
212 if (err != WSAEWOULDBLOCK) return err; 213 if (err != WSAEWOULDBLOCK) return err;
213 /* avoid busy wait */ 214 /* avoid busy wait */
214 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; 215 if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
215 } 216 }
216 /* can't reach here */ 217 /* can't reach here */
217 return IO_UNKNOWN; 218 return IO_UNKNOWN;
@@ -220,11 +221,11 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm)
220/*-------------------------------------------------------------------------*\ 221/*-------------------------------------------------------------------------*\
221* Sendto with timeout 222* Sendto with timeout
222\*-------------------------------------------------------------------------*/ 223\*-------------------------------------------------------------------------*/
223int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, 224int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,
224 SA *addr, socklen_t len, p_tm tm) 225 SA *addr, socklen_t len, p_tm tm)
225{ 226{
226 int err; 227 int err;
227 if (*ps == SOCK_INVALID) return IO_CLOSED; 228 if (*ps == SOCKET_INVALID) return IO_CLOSED;
228 *sent = 0; 229 *sent = 0;
229 for ( ;; ) { 230 for ( ;; ) {
230 int put = sendto(*ps, data, (int) count, 0, addr, len); 231 int put = sendto(*ps, data, (int) count, 0, addr, len);
@@ -234,7 +235,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
234 } 235 }
235 err = WSAGetLastError(); 236 err = WSAGetLastError();
236 if (err != WSAEWOULDBLOCK) return err; 237 if (err != WSAEWOULDBLOCK) return err;
237 if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; 238 if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err;
238 } 239 }
239 return IO_UNKNOWN; 240 return IO_UNKNOWN;
240} 241}
@@ -242,9 +243,9 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent,
242/*-------------------------------------------------------------------------*\ 243/*-------------------------------------------------------------------------*\
243* Receive with timeout 244* Receive with timeout
244\*-------------------------------------------------------------------------*/ 245\*-------------------------------------------------------------------------*/
245int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) { 246int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_tm tm) {
246 int err; 247 int err;
247 if (*ps == SOCK_INVALID) return IO_CLOSED; 248 if (*ps == SOCKET_INVALID) return IO_CLOSED;
248 *got = 0; 249 *got = 0;
249 for ( ;; ) { 250 for ( ;; ) {
250 int taken = recv(*ps, data, (int) count, 0); 251 int taken = recv(*ps, data, (int) count, 0);
@@ -255,7 +256,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) {
255 if (taken == 0) return IO_CLOSED; 256 if (taken == 0) return IO_CLOSED;
256 err = WSAGetLastError(); 257 err = WSAGetLastError();
257 if (err != WSAEWOULDBLOCK) return err; 258 if (err != WSAEWOULDBLOCK) return err;
258 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; 259 if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
259 } 260 }
260 return IO_UNKNOWN; 261 return IO_UNKNOWN;
261} 262}
@@ -263,10 +264,10 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) {
263/*-------------------------------------------------------------------------*\ 264/*-------------------------------------------------------------------------*\
264* Recvfrom with timeout 265* Recvfrom with timeout
265\*-------------------------------------------------------------------------*/ 266\*-------------------------------------------------------------------------*/
266int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, 267int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
267 SA *addr, socklen_t *len, p_tm tm) { 268 SA *addr, socklen_t *len, p_tm tm) {
268 int err; 269 int err;
269 if (*ps == SOCK_INVALID) return IO_CLOSED; 270 if (*ps == SOCKET_INVALID) return IO_CLOSED;
270 *got = 0; 271 *got = 0;
271 for ( ;; ) { 272 for ( ;; ) {
272 int taken = recvfrom(*ps, data, (int) count, 0, addr, len); 273 int taken = recvfrom(*ps, data, (int) count, 0, addr, len);
@@ -277,7 +278,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
277 if (taken == 0) return IO_CLOSED; 278 if (taken == 0) return IO_CLOSED;
278 err = WSAGetLastError(); 279 err = WSAGetLastError();
279 if (err != WSAEWOULDBLOCK) return err; 280 if (err != WSAEWOULDBLOCK) return err;
280 if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; 281 if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
281 } 282 }
282 return IO_UNKNOWN; 283 return IO_UNKNOWN;
283} 284}
@@ -285,7 +286,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got,
285/*-------------------------------------------------------------------------*\ 286/*-------------------------------------------------------------------------*\
286* Put socket into blocking mode 287* Put socket into blocking mode
287\*-------------------------------------------------------------------------*/ 288\*-------------------------------------------------------------------------*/
288void sock_setblocking(p_sock ps) { 289void socket_setblocking(p_socket ps) {
289 u_long argp = 0; 290 u_long argp = 0;
290 ioctlsocket(*ps, FIONBIO, &argp); 291 ioctlsocket(*ps, FIONBIO, &argp);
291} 292}
@@ -293,7 +294,7 @@ void sock_setblocking(p_sock ps) {
293/*-------------------------------------------------------------------------*\ 294/*-------------------------------------------------------------------------*\
294* Put socket into non-blocking mode 295* Put socket into non-blocking mode
295\*-------------------------------------------------------------------------*/ 296\*-------------------------------------------------------------------------*/
296void sock_setnonblocking(p_sock ps) { 297void socket_setnonblocking(p_socket ps) {
297 u_long argp = 1; 298 u_long argp = 1;
298 ioctlsocket(*ps, FIONBIO, &argp); 299 ioctlsocket(*ps, FIONBIO, &argp);
299} 300}
@@ -301,13 +302,13 @@ void sock_setnonblocking(p_sock ps) {
301/*-------------------------------------------------------------------------*\ 302/*-------------------------------------------------------------------------*\
302* DNS helpers 303* DNS helpers
303\*-------------------------------------------------------------------------*/ 304\*-------------------------------------------------------------------------*/
304int sock_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) { 305int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) {
305 *hp = gethostbyaddr(addr, len, AF_INET); 306 *hp = gethostbyaddr(addr, len, AF_INET);
306 if (*hp) return IO_DONE; 307 if (*hp) return IO_DONE;
307 else return WSAGetLastError(); 308 else return WSAGetLastError();
308} 309}
309 310
310int sock_gethostbyname(const char *addr, struct hostent **hp) { 311int socket_gethostbyname(const char *addr, struct hostent **hp) {
311 *hp = gethostbyname(addr); 312 *hp = gethostbyname(addr);
312 if (*hp) return IO_DONE; 313 if (*hp) return IO_DONE;
313 else return WSAGetLastError(); 314 else return WSAGetLastError();
@@ -316,7 +317,7 @@ int sock_gethostbyname(const char *addr, struct hostent **hp) {
316/*-------------------------------------------------------------------------*\ 317/*-------------------------------------------------------------------------*\
317* Error translation functions 318* Error translation functions
318\*-------------------------------------------------------------------------*/ 319\*-------------------------------------------------------------------------*/
319const char *sock_hoststrerror(int err) { 320const char *socket_hoststrerror(int err) {
320 if (err <= 0) return io_strerror(err); 321 if (err <= 0) return io_strerror(err);
321 switch (err) { 322 switch (err) {
322 case WSAHOST_NOT_FOUND: return "host not found"; 323 case WSAHOST_NOT_FOUND: return "host not found";
@@ -324,7 +325,7 @@ const char *sock_hoststrerror(int err) {
324 } 325 }
325} 326}
326 327
327const char *sock_strerror(int err) { 328const char *socket_strerror(int err) {
328 if (err <= 0) return io_strerror(err); 329 if (err <= 0) return io_strerror(err);
329 switch (err) { 330 switch (err) {
330 case WSAEADDRINUSE: return "address already in use"; 331 case WSAEADDRINUSE: return "address already in use";
@@ -338,9 +339,9 @@ const char *sock_strerror(int err) {
338 } 339 }
339} 340}
340 341
341const char *sock_ioerror(p_sock ps, int err) { 342const char *socket_ioerror(p_socket ps, int err) {
342 (void) ps; 343 (void) ps;
343 return sock_strerror(err); 344 return socket_strerror(err);
344} 345}
345 346
346static const char *wstrerror(int err) { 347static const char *wstrerror(int err) {