summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAsbjørn Sloth Tønnesen <asbjorn@asbjorn.biz>2013-09-18 18:51:02 +0000
committerEmil Renner Berthing <esmil@mailme.dk>2013-11-11 20:43:46 +0100
commit988a50b2843aae8729a61edc795ffe12a5f3e43d (patch)
tree35398a4e4f191f88e733d6d9e65f4bc0d5f59c55
parent709a0e29f3f727ad44038c4b68c512e234040f3d (diff)
downloadlem-988a50b2843aae8729a61edc795ffe12a5f3e43d.tar.gz
lem-988a50b2843aae8729a61edc795ffe12a5f3e43d.tar.xz
lem-988a50b2843aae8729a61edc795ffe12a5f3e43d.zip
signal: add support for looking up signals by number
Signed-off-by: Asbjørn Sloth Tønnesen <asbjorn@asbjorn.biz> Signed-off-by: Emil Renner Berthing <esmil@mailme.dk>
-rw-r--r--lem/signal.lua14
-rw-r--r--lem/signal/core.c29
-rwxr-xr-xtest/signal.lua2
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++) {
@@ -255,6 +254,23 @@ signal_lookup(lua_State *T)
}
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)
{
int type;
@@ -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')