diff options
author | Asbjørn Sloth Tønnesen <asbjorn@asbjorn.biz> | 2013-09-17 20:23:41 +0000 |
---|---|---|
committer | Emil Renner Berthing <esmil@mailme.dk> | 2013-11-11 20:43:46 +0100 |
commit | aa8444f4c56b5fc93b20d3b3c10ee44a00667102 (patch) | |
tree | a45d487e93aa73bcbbffacde3ce583f1e7164325 | |
parent | bc00e65c7a31d92e13e27c8ed1260e263d49360f (diff) | |
download | lem-aa8444f4c56b5fc93b20d3b3c10ee44a00667102.tar.gz lem-aa8444f4c56b5fc93b20d3b3c10ee44a00667102.tar.xz lem-aa8444f4c56b5fc93b20d3b3c10ee44a00667102.zip |
signal: add signal lookup
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.lua | 11 | ||||
-rw-r--r-- | lem/signal/core.c | 41 |
2 files changed, 49 insertions, 3 deletions
diff --git a/lem/signal.lua b/lem/signal.lua index 6dbf060..ed3f4db 100644 --- a/lem/signal.lua +++ b/lem/signal.lua @@ -71,9 +71,15 @@ do end end +local function lookup(signal) + return core.lookup(string.sub(signal, 4):upper()) +end + local M = {} +M.lookup = lookup -function M.register(signum, func) +function M.register(signal, func) + local signum = lookup(signal) if not signum then return nil, 'unknown signal' end local queue = queues[signum] @@ -85,7 +91,8 @@ function M.register(signum, func) return signal_install(signum) end -function M.unregister(signum, func) +function M.unregister(signal, func) + local signum = lookup(signal) if not signum then return nil, 'unknown signal' end local queue = queues[signum] diff --git a/lem/signal/core.c b/lem/signal/core.c index db6228a..6cfc3e8 100644 --- a/lem/signal/core.c +++ b/lem/signal/core.c @@ -25,7 +25,25 @@ #include <stdlib.h> #include <string.h> -static int signal_sethandler(lua_State *T); +struct signal_mapping { + const char *name; + uint8_t no; +}; + +/* Several signal numbers are architecture-dependent, + * therefore we need a lookup table on the C-side */ +#define ARRAYLEN(a) (sizeof(a)/sizeof((a)[0])) +#define _(sig) { #sig, SIG ## sig } +static struct signal_mapping sigmap[] = { + _(HUP), _(INT), _(USR1), _(USR2), + _(QUIT), _(ILL), _(TRAP), _(ABRT), + _(BUS), _(FPE), _(SEGV), _(PIPE), + _(ALRM), _(TERM), _(CONT), _(CHLD), + _(TSTP), _(TTIN), _(TTOU), _(PWR), + _(PROF), _(SYS), _(URG), _(VTALRM), + _(XCPU), _(XFSZ), _(WINCH) +}; +#undef _ #if EV_SIGNAL_ENABLE struct sigwatcher { @@ -127,6 +145,24 @@ signal_os_unwatch(lua_State *T) #endif static int +signal_lookup(lua_State *T) +{ + const char *needle = luaL_checkstring(T, 1); + + unsigned int i; + + for (i = 0; i < ARRAYLEN(sigmap); i++) { + struct signal_mapping *sig = &sigmap[i]; + if (strcmp(sig->name, needle) == 0) { + lua_pushinteger(T, sig->no); + return 1; + } + } + lua_pushnil(T); + return 1; +} + +static int signal_sethandler(lua_State *T) { int type; @@ -177,6 +213,9 @@ 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 sethandler function */ lua_pushcfunction(T, signal_sethandler); lua_setfield(T, -2, "sethandler"); |