aboutsummaryrefslogtreecommitdiff
path: root/src/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tcp.c')
-rw-r--r--src/tcp.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/tcp.c b/src/tcp.c
index 098e29d..d68db08 100644
--- a/src/tcp.c
+++ b/src/tcp.c
@@ -198,21 +198,21 @@ static int meth_accept(lua_State *L)
198{ 198{
199 struct sockaddr_in addr; 199 struct sockaddr_in addr;
200 socklen_t addr_len = sizeof(addr); 200 socklen_t addr_len = sizeof(addr);
201 int err = IO_ERROR;
201 p_tcp server = (p_tcp) aux_checkclass(L, "tcp{server}", 1); 202 p_tcp server = (p_tcp) aux_checkclass(L, "tcp{server}", 1);
202 p_tm tm = &server->tm; 203 p_tm tm = &server->tm;
203 p_tcp client = lua_newuserdata(L, sizeof(t_tcp)); 204 p_tcp client = lua_newuserdata(L, sizeof(t_tcp));
204 tm_markstart(tm);
205 aux_setclass(L, "tcp{client}", -1); 205 aux_setclass(L, "tcp{client}", -1);
206 for ( ;; ) { 206 tm_markstart(tm);
207 sock_accept(&server->sock, &client->sock, 207 /* loop until connection accepted or timeout happens */
208 (SA *) &addr, &addr_len, tm_get(tm)); 208 while (err != IO_DONE) {
209 if (client->sock == SOCK_INVALID) { 209 err = sock_accept(&server->sock, &client->sock,
210 if (tm_get(tm) == 0) { 210 (SA *) &addr, &addr_len, tm_getfailure(tm));
211 lua_pushnil(L); 211 if (err == IO_CLOSED || (err == IO_TIMEOUT && !tm_getfailure(tm))) {
212 io_pusherror(L, IO_TIMEOUT); 212 lua_pushnil(L);
213 return 2; 213 io_pusherror(L, err);
214 } 214 return 2;
215 } else break; 215 }
216 } 216 }
217 /* initialize remaining structure fields */ 217 /* initialize remaining structure fields */
218 io_init(&client->io, (p_send) sock_send, (p_recv) sock_recv, &client->sock); 218 io_init(&client->io, (p_send) sock_send, (p_recv) sock_recv, &client->sock);