diff --git a/daemon/bindings.c b/daemon/bindings.c index f6cfd43630034624f36a092ac6e3ed09c519fcd7..f8a80df7261319602125397401441d7cbd537a78 100644 --- a/daemon/bindings.c +++ b/daemon/bindings.c @@ -92,28 +92,66 @@ int lib_modules(lua_State *L) return 1; } +/** Append 'addr = {port = int, udp = bool, tcp = bool}' */ +static int net_list_add(const char *key, void *val, void *ext) +{ + lua_State *L = (lua_State *)ext; + endpoint_array_t *ep_array = val; + lua_newtable(L); + for (size_t i = ep_array->len; i--;) { + struct endpoint *ep = ep_array->at[i]; + lua_pushinteger(L, ep->port); + lua_setfield(L, -2, "port"); + lua_pushboolean(L, ep->flags & NET_UDP); + lua_setfield(L, -2, "udp"); + lua_pushboolean(L, ep->flags & NET_TCP); + lua_setfield(L, -2, "tcp"); + } + lua_setfield(L, -2, key); + return kr_ok(); +} + /** List active endpoints. */ static int net_list(lua_State *L) { - lua_pushstring(L, "not implemented"); - lua_error(L); - return 0; + struct engine *engine = engine_luaget(L); + lua_newtable(L); + map_walk(&engine->net.endpoints, net_list_add, L); + return 1; } /** Listen on endpoint. */ static int net_listen(lua_State *L) { - lua_pushstring(L, "not implemented"); - lua_error(L); - return 0; + /* Check parameters */ + int n = lua_gettop(L); + if (n < 2) { + lua_pushstring(L, "expected (string addr, int port)"); + lua_error(L); + } + + /* Open resolution context cache */ + struct engine *engine = engine_luaget(L); + int ret = network_listen(&engine->net, lua_tostring(L, 1), lua_tointeger(L, 2), NET_TCP|NET_UDP); + lua_pushboolean(L, ret == 0); + return 1; } /** Close endpoint. */ static int net_close(lua_State *L) { - lua_pushstring(L, "not implemented"); - lua_error(L); - return 0; + /* Check parameters */ + int n = lua_gettop(L); + if (n < 2) { + lua_pushstring(L, "expected (string addr, int port)"); + lua_error(L); + } + + /* Open resolution context cache */ + struct engine *engine = engine_luaget(L); + int ret = network_close(&engine->net, lua_tostring(L, 1), lua_tointeger(L, 2)); + lua_pushboolean(L, ret == 0); + return 1; } /** List available interfaces.