]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
lib/posix-process/signal: Add rt_sigprocmask()
authorMichalis Pappas <michalis@unikraft.io>
Tue, 18 Mar 2025 08:49:28 +0000 (09:49 +0100)
committerUnikraft Bot <monkey@unikraft.io>
Wed, 26 Mar 2025 08:05:34 +0000 (08:05 +0000)
rt_sigprocmask() allows examining and changing blocked signals.
For more info see sigprocmask(2).

Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Ioan-Teodor Teugea <ioan_teodor.teugea@stud.acs.upb.ro>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Reviewed-by: Andrei Tatar <andrei@unikraft.io>
Approved-by: Andrei Tatar <andrei@unikraft.io>
GitHub-Closes: #1248

lib/posix-process/Makefile.uk
lib/posix-process/exportsyms.uk
lib/posix-process/signal/rt_sigprocmask.c [new file with mode: 0644]

index a36759ca2a7ac362940bf36123cadb5a00fb5aef..532d15feaaa0bd69dba2387b4c75ac89064ab3a0 100644 (file)
@@ -20,6 +20,7 @@ LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/wait.c
 LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signals.c
 
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_SIGNAL) += $(LIBPOSIX_PROCESS_BASE)/signal/signal.c
+LIBPOSIX_PROCESS_SRCS-y += $(LIBPOSIX_PROCESS_BASE)/signal/rt_sigprocmask.c
 
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += $(LIBPOSIX_PROCESS_BASE)/clone.c
 LIBPOSIX_PROCESS_SRCS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += $(LIBPOSIX_PROCESS_BASE)/clonetab.ld
@@ -33,6 +34,7 @@ LIBPOSIX_PROCESS_CXXINCLUDES-y += -I$(UK_PLAT_COMMON_BASE)/include
 
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_CLONE) += clone-5e
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_EXECVE) += execve-3e
+UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += rt_sigprocmask-4
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS_VFORK) += vfork-2e
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += wait4-4 waitid-4
 UK_PROVIDED_SYSCALLS-$(CONFIG_LIBPOSIX_PROCESS) += getpgid-1
index 18dc25a074ee90e25b6f9fba027866093f294fbd..f7cf4baffc751abf30a08109ae8ee09d1bcb6412 100644 (file)
@@ -42,3 +42,4 @@ uk_posix_process_create
 uk_posix_process_kill
 clone
 vfork
+sigprocmask
diff --git a/lib/posix-process/signal/rt_sigprocmask.c b/lib/posix-process/signal/rt_sigprocmask.c
new file mode 100644 (file)
index 0000000..305c9cd
--- /dev/null
@@ -0,0 +1,83 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Copyright (c) 2023, Unikraft GmbH and The Unikraft Authors.
+ * Licensed under the BSD-3-Clause License (the "License").
+ * You may not use this file except in compliance with the License.
+ */
+
+#include <errno.h>
+#include <signal.h>
+
+#include <uk/essentials.h>
+#include <uk/process.h>
+#include <uk/syscall.h>
+
+#include "process.h"
+#include "signal.h"
+#include "sigset.h"
+
+#if CONFIG_LIBPOSIX_PROCESS_SIGNAL
+UK_LLSYSCALL_R_DEFINE(int, rt_sigprocmask,
+                     int, how,
+                     const uk_sigset_t *, set,
+                     uk_sigset_t *, oldset,
+                     size_t, sigsetsize)
+{
+       struct posix_thread *pthread;
+       uk_sigset_t tmpset;
+
+       if (unlikely(sigsetsize != sizeof(uk_sigset_t)))
+               return -EINVAL;
+
+       pthread = uk_pthread_current();
+       UK_ASSERT(pthread);
+
+       if (oldset)
+               *oldset = pthread->signal->mask;
+
+       if (!set)
+               return 0;
+
+       /* copy to mutable set */
+       uk_sigcopyset(&tmpset, set);
+
+       /* ignore attempts to mask SIGKILL / SIGSTOP */
+       uk_sigdelset(&tmpset, SIGKILL);
+       uk_sigdelset(&tmpset, SIGSTOP);
+
+       /* update */
+       switch (how) {
+       case SIG_BLOCK:
+               uk_sigorset(&pthread->signal->mask, &tmpset);
+               break;
+       case SIG_UNBLOCK:
+               uk_sigreverseset(&tmpset);
+               uk_sigandset(&pthread->signal->mask, &tmpset);
+               break;
+       case SIG_SETMASK:
+               uk_sigcopyset(&pthread->signal->mask, &tmpset);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+#else /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+UK_LLSYSCALL_R_DEFINE(int, rt_sigprocmask,
+                     int, how,
+                     const uk_sigset_t *, set,
+                     uk_sigset_t *, oldset,
+                     size_t, sigsetsize)
+{
+       UK_WARN_STUBBED();
+       return 0;
+}
+#endif /* !CONFIG_LIBPOSIX_PROCESS_SIGNAL */
+
+#if UK_LIBC_SYSCALLS
+int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
+{
+       return uk_syscall_e_rt_sigprocmask(how, (long)set, (long)oldset,
+                                          sizeof(uk_sigset_t));
+}
+#endif /* UK_LIBC_SYSCALLS */