From 86d65b2c93696955e19f69b790f64019460d1ebb Mon Sep 17 00:00:00 2001 From: Tobias Ulmer Date: Tue, 12 Feb 2019 19:24:28 +0100 Subject: [PATCH] le2lib: add functions to block and unblock signals Signed-off-by: Tobias Ulmer --- generic/le2lib.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/generic/le2lib.c b/generic/le2lib.c index bac7f73..b0d32e1 100644 --- a/generic/le2lib.c +++ b/generic/le2lib.c @@ -41,6 +41,8 @@ static char buffer[PATH_MAX + 1]; +static sigset_t block_set; + static int lua_fork(lua_State *lua) { @@ -846,6 +848,12 @@ signal_install(lua_State *L) /* Lua context for use in signal handler */ globalL = L; + /* Default signal blocking set while running a handler or + * critical section */ + sigemptyset(&block_set); + for (i = 0; signals[i] != 0; i++) + sigaddset(&block_set, signals[i]); + sa.sa_handler = signal_handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); @@ -885,6 +893,24 @@ signal_received(lua_State *L) return 2; } +static int +signal_block(lua_State *lua) +{ + if (sigprocmask(SIG_BLOCK, &block_set, NULL) < 0) + return luaL_error(lua, "sigprocmask(SIG_BLOCK) failed: %s", + strerror(errno)); + return 0; +} + +static int +signal_unblock(lua_State *lua) +{ + if (sigprocmask(SIG_UNBLOCK, &block_set, NULL) < 0) + return luaL_error(lua, "sigprocmask(SIG_UNBLOCK) failed: %s", + strerror(errno)); + return 0; +} + static int do_forkpty(lua_State *L) { @@ -928,9 +954,11 @@ static luaL_Reg lib[] = { { "rename", do_rename }, { "rmdir", do_rmdir }, { "setenv", do_setenv }, - { "signal_reset", signal_reset }, + { "signal_block", signal_block }, { "signal_install", signal_install }, { "signal_received", signal_received }, + { "signal_reset", signal_reset }, + { "signal_unblock", signal_unblock }, { "stat", get_file_statistics }, { "symlink", create_symlink }, { "umask", set_umask }, -- 2.39.5