From: Michalis Pappas Date: Tue, 18 Mar 2025 08:49:28 +0000 (+0100) Subject: lib/posix-process/signal: Add rt_sigprocmask() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=a618c84f4e2eb290097900adf79043f9bbcb8644;p=unikraft%2Funikraft.git lib/posix-process/signal: Add rt_sigprocmask() rt_sigprocmask() allows examining and changing blocked signals. For more info see sigprocmask(2). Signed-off-by: Michalis Pappas Reviewed-by: Ioan-Teodor Teugea Reviewed-by: Sergiu Moga Reviewed-by: Andrei Tatar Approved-by: Andrei Tatar GitHub-Closes: #1248 --- diff --git a/lib/posix-process/Makefile.uk b/lib/posix-process/Makefile.uk index a36759ca2..532d15fea 100644 --- a/lib/posix-process/Makefile.uk +++ b/lib/posix-process/Makefile.uk @@ -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 diff --git a/lib/posix-process/exportsyms.uk b/lib/posix-process/exportsyms.uk index 18dc25a07..f7cf4baff 100644 --- a/lib/posix-process/exportsyms.uk +++ b/lib/posix-process/exportsyms.uk @@ -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 index 000000000..305c9cd3f --- /dev/null +++ b/lib/posix-process/signal/rt_sigprocmask.c @@ -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 +#include + +#include +#include +#include + +#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 */