summaryrefslogtreecommitdiff
path: root/src/basic/signal-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2022-11-16 18:54:29 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-11-17 22:38:14 +0900
commit128a11ea9905ee3a9d2c6baeaf65618a21272f97 (patch)
treecc1c7d4a26fff9f9ded817ac0aecb37811ab0ec6 /src/basic/signal-util.c
parent58dad4d5e585a6c18452dd97153ec0f2d240c2d8 (diff)
downloadsystemd-128a11ea9905ee3a9d2c6baeaf65618a21272f97.tar.gz
signal-util: add common implementation for propagating a signal
i.e. let's add a common logic to be called from a signal handler to raise the passed signal again. Follow-up for: #25399
Diffstat (limited to 'src/basic/signal-util.c')
-rw-r--r--src/basic/signal-util.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/basic/signal-util.c b/src/basic/signal-util.c
index b61c18b2de..7875ca69bb 100644
--- a/src/basic/signal-util.c
+++ b/src/basic/signal-util.c
@@ -5,6 +5,7 @@
#include "errno-util.h"
#include "macro.h"
+#include "missing_syscall.h"
#include "parse-util.h"
#include "signal-util.h"
#include "stdio-util.h"
@@ -282,3 +283,20 @@ int pop_pending_signal_internal(int sig, ...) {
return r; /* Returns the signal popped */
}
+
+void propagate_signal(int sig, siginfo_t *siginfo) {
+ pid_t p;
+
+ /* To be called from a signal handler. Will raise the same signal again, in our process + in our threads.
+ *
+ * Note that we use raw_getpid() instead of getpid_cached(). We might have forked with raw_clone()
+ * earlier (see PID 1), and hence let's go to the raw syscall here. In particular as this is not
+ * performance sensitive code.
+ *
+ * Note that we use kill() rather than raise() as fallback, for similar reasons. */
+
+ p = raw_getpid();
+
+ if (rt_tgsigqueueinfo(p, gettid(), sig, siginfo) < 0)
+ assert_se(kill(p, sig) >= 0);
+}