summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Renner Berthing <esmil@mailme.dk>2013-01-27 11:28:49 +0100
committerEmil Renner Berthing <esmil@mailme.dk>2013-01-27 17:32:14 +0100
commitaf89ca0fbbb10beaf81cd7f8f36345802ce9476c (patch)
treec6eb50a1107cdc045bb532b93b61a390ac91b2dc
parent09b50bc8c8a3a03dc57374b138ff18d16e119df4 (diff)
downloadlem-af89ca0fbbb10beaf81cd7f8f36345802ce9476c.tar.gz
lem-af89ca0fbbb10beaf81cd7f8f36345802ce9476c.tar.xz
lem-af89ca0fbbb10beaf81cd7f8f36345802ce9476c.zip
io: make accept() close fd after watch is stopped
-rw-r--r--lem/io/server.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/lem/io/server.c b/lem/io/server.c
index c2c5f55..482d32a 100644
--- a/lem/io/server.c
+++ b/lem/io/server.c
@@ -102,8 +102,6 @@ server__accept(lua_State *T, struct ev_io *w, int mt)
if (errno == EAGAIN || errno == ECONNABORTED)
return 0;
- close(w->fd);
- w->fd = -1;
lua_pushnil(T);
lua_pushfstring(T, "error accepting connection: %s",
strerror(errno));
@@ -136,6 +134,10 @@ server_accept_cb(EV_P_ struct ev_io *w, int revents)
w->data = NULL;
ev_io_stop(EV_A_ w);
+ if (ret == 2) {
+ close(w->fd);
+ w->fd = -1;
+ }
lem_queue(w->data, ret);
}
@@ -143,7 +145,6 @@ static int
server_accept(lua_State *T)
{
struct ev_io *w;
- int ret;
luaL_checktype(T, 1, LUA_TUSERDATA);
w = lua_touserdata(T, 1);
@@ -152,9 +153,14 @@ server_accept(lua_State *T)
if (w->data != NULL)
return io_busy(T);
- ret = server__accept(T, w, lua_upvalueindex(1));
- if (ret > 0)
- return ret;
+ switch (server__accept(T, w, lua_upvalueindex(1))) {
+ case 1:
+ return 1;
+ case 2:
+ close(w->fd);
+ w->fd= -1;
+ return 2;
+ }
w->cb = server_accept_cb;
w->data = T;