From 988a50b2843aae8729a61edc795ffe12a5f3e43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asbj=C3=B8rn=20Sloth=20T=C3=B8nnesen?= Date: Wed, 18 Sep 2013 18:51:02 +0000 Subject: signal: add support for looking up signals by number MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Asbjørn Sloth Tønnesen Signed-off-by: Emil Renner Berthing --- lem/signal.lua | 14 +++++++++++++- lem/signal/core.c | 29 ++++++++++++++++++++++++----- test/signal.lua | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/lem/signal.lua b/lem/signal.lua index ed3f4db..b3d84cb 100644 --- a/lem/signal.lua +++ b/lem/signal.lua @@ -72,13 +72,24 @@ do end local function lookup(signal) - return core.lookup(string.sub(signal, 4):upper()) + if type(signal) == 'string' then + if string.sub(signal, 1, 3):upper() == 'SIG' then + signal = string.sub(signal, 4) + end + return core.tonumber(signal:upper()) + else + local ret = core.tostring(signal) + if not ret then return nil end + + return 'SIG' .. ret + end end local M = {} M.lookup = lookup function M.register(signal, func) + assert(type(signal) == 'string', 'signal should be a string') local signum = lookup(signal) if not signum then return nil, 'unknown signal' end @@ -92,6 +103,7 @@ function M.register(signal, func) end function M.unregister(signal, func) + assert(type(signal) == 'string', 'signal should be a string') local signum = lookup(signal) if not signum then return nil, 'unknown signal' end diff --git a/lem/signal/core.c b/lem/signal/core.c index 5978ae3..8a8dae8 100644 --- a/lem/signal/core.c +++ b/lem/signal/core.c @@ -237,10 +237,9 @@ signal_child_unwatch(lua_State *T) #endif static int -signal_lookup(lua_State *T) +signal_tonumber(lua_State *T) { const char *needle = luaL_checkstring(T, 1); - unsigned int i; for (i = 0; i < ARRAYLEN(sigmap); i++) { @@ -254,6 +253,23 @@ signal_lookup(lua_State *T) return 1; } +static int +signal_tostring(lua_State *T) +{ + int needle = luaL_checkint(T, 1); + unsigned int i; + + for (i = 0; i < ARRAYLEN(sigmap); i++) { + struct signal_mapping *sig = &sigmap[i]; + if (sig->no == needle) { + lua_pushstring(T, sig->name); + return 1; + } + } + lua_pushnil(T); + return 1; +} + static int signal_sethandler(lua_State *T) { @@ -316,9 +332,12 @@ luaopen_lem_signal_core(lua_State *T) /* create module table */ lua_newtable(T); - /* set lookup function */ - lua_pushcfunction(T, signal_lookup); - lua_setfield(T, -2, "lookup"); + /* set tonumber function */ + lua_pushcfunction(T, signal_tonumber); + lua_setfield(T, -2, "tonumber"); + /* set tostring function */ + lua_pushcfunction(T, signal_tostring); + lua_setfield(T, -2, "tostring"); /* set sethandler function */ lua_pushcfunction(T, signal_sethandler); lua_setfield(T, -2, "sethandler"); diff --git a/test/signal.lua b/test/signal.lua index 46c85a2..75e5429 100755 --- a/test/signal.lua +++ b/test/signal.lua @@ -39,7 +39,7 @@ io.popen(cmd) sleeper:sleep(1) local function handler(signum) - print('got signal number ' .. signum) + print('got ' .. signal.lookup(signum)) end print('catch sigint') -- cgit v1.2.1