diff options
Diffstat (limited to 'src/tcp.c')
-rw-r--r-- | src/tcp.c | 22 |
1 files changed, 11 insertions, 11 deletions
@@ -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); |