diff options
author | Emil Renner Berthing <esmil@mailme.dk> | 2013-01-27 11:28:49 +0100 |
---|---|---|
committer | Emil Renner Berthing <esmil@mailme.dk> | 2013-01-27 17:32:14 +0100 |
commit | af89ca0fbbb10beaf81cd7f8f36345802ce9476c (patch) | |
tree | c6eb50a1107cdc045bb532b93b61a390ac91b2dc | |
parent | 09b50bc8c8a3a03dc57374b138ff18d16e119df4 (diff) | |
download | lem-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.c | 18 |
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; |