util-src/signal.c
changeset 13443 1e229d710a3c
parent 12980 a187600ec7d6
child 13445 6d96b6eeee5a
--- a/util-src/signal.c	Fri Feb 23 22:45:42 2024 +0000
+++ b/util-src/signal.c	Sat Feb 24 00:05:29 2024 +0100
@@ -32,6 +32,10 @@
 
 #include <signal.h>
 #include <stdlib.h>
+#ifdef __linux__
+#include <unistd.h>
+#include <sys/signalfd.h>
+#endif
 
 #include "lua.h"
 #include "lauxlib.h"
@@ -368,12 +372,42 @@
 
 #endif
 
+#ifdef __linux__
+static int l_signalfd(lua_State *L) {
+	sigset_t mask;
+
+	sigemptyset(&mask);
+	sigaddset(&mask, luaL_checkinteger(L, 1));
+
+	sigprocmask(SIG_BLOCK, &mask, NULL); /* TODO check err */
+
+	lua_pushinteger(L, signalfd(-1, &mask, SFD_NONBLOCK));
+	return 1;
+}
+
+static int l_signalfd_read(lua_State *L) {
+	const int sigfd = luaL_checkinteger(L, 1);
+	struct signalfd_siginfo siginfo;
+
+	if(read(sigfd, &siginfo, sizeof(siginfo)) < 0) {
+		return 0;
+	}
+
+	lua_pushinteger(L, siginfo.ssi_signo);
+	return 1;
+}
+#endif
+
 static const struct luaL_Reg lsignal_lib[] = {
 	{"signal", l_signal},
 	{"raise", l_raise},
 #if defined(__unix__) || defined(__APPLE__)
 	{"kill", l_kill},
 #endif
+#ifdef __linux__
+	{"signalfd", l_signalfd},
+	{"signalfd_read", l_signalfd_read},
+#endif
 	{NULL, NULL}
 };