]> git.e2factory.org Git - e2factory.git/commitdiff
le2lib: add functions to block and unblock signals
authorTobias Ulmer <tu@emlix.com>
Tue, 12 Feb 2019 18:24:28 +0000 (19:24 +0100)
committerTobias Ulmer <tu@emlix.com>
Tue, 12 Feb 2019 18:24:28 +0000 (19:24 +0100)
Signed-off-by: Tobias Ulmer <tu@emlix.com>
generic/le2lib.c

index bac7f735f155165f2dc8f658f311359b5048b80b..b0d32e177e732f8af20ac6ff5b548b4457f5c84b 100644 (file)
@@ -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 },