summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAsbjørn Sloth Tønnesen <asbjorn@asbjorn.biz>2013-09-17 20:23:41 +0000
committerEmil Renner Berthing <esmil@mailme.dk>2013-11-11 20:43:46 +0100
commitaa8444f4c56b5fc93b20d3b3c10ee44a00667102 (patch)
treea45d487e93aa73bcbbffacde3ce583f1e7164325
parentbc00e65c7a31d92e13e27c8ed1260e263d49360f (diff)
downloadlem-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.lua11
-rw-r--r--lem/signal/core.c41
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");