From f4168e2815231d75ac6008c0467dd9f663bc2725 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Thu, 20 Feb 2025 02:07:40 +0200 Subject: [PATCH] refactor(userspace/libc): implement pthread_sigmask, sigaddset, sigfillset & sigprocmask Signed-off-by: EnderIce2 --- Userspace/libc/include/signal.h | 8 ++--- Userspace/libc/src/std/signal.c | 59 ++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Userspace/libc/include/signal.h b/Userspace/libc/include/signal.h index 7d1bfb34..a52cb1db 100644 --- a/Userspace/libc/include/signal.h +++ b/Userspace/libc/include/signal.h @@ -194,19 +194,19 @@ extern "C" void psiginfo(const siginfo_t *, const char *); void psignal(int, const char *); int pthread_kill(pthread_t, int); - int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict); + int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset); int raise(int); int sig2str(int, char *); int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact); - int sigaddset(sigset_t *, int); + int sigaddset(sigset_t *set, int signo); int sigaltstack(const stack_t *restrict, stack_t *restrict); int sigdelset(sigset_t *, int); int sigemptyset(sigset_t *set); - int sigfillset(sigset_t *); + int sigfillset(sigset_t *set); int sigismember(const sigset_t *, int); void (*signal(int sig, void (*func)(int)))(int); int sigpending(sigset_t *); - int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict); + int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset); int sigqueue(pid_t, int, union sigval); int sigsuspend(const sigset_t *); int sigtimedwait(const sigset_t *restrict, siginfo_t *restrict, const struct timespec *restrict); diff --git a/Userspace/libc/src/std/signal.c b/Userspace/libc/src/std/signal.c index a7416c59..57bd419a 100644 --- a/Userspace/libc/src/std/signal.c +++ b/Userspace/libc/src/std/signal.c @@ -28,7 +28,12 @@ export int killpg(pid_t, int); export void psiginfo(const siginfo_t *, const char *); export void psignal(int, const char *); export int pthread_kill(pthread_t, int); -export int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict); + +export int pthread_sigmask(int how, const sigset_t *restrict set, sigset_t *restrict oset) +{ + return sigprocmask(how, set, oset); +} + export int raise(int); export int sig2str(int, char *); @@ -57,7 +62,18 @@ export int sigaction(int sig, const struct sigaction *restrict act, struct sigac return 0; } -export int sigaddset(sigset_t *, int); +export int sigaddset(sigset_t *set, int signo) +{ + if (set == NULL || signo <= 0 || signo >= SIGNAL_MAX) + { + errno = EINVAL; + return -1; + } + + *set |= (1U << (signo - 1)); + return 0; +} + export int sigaltstack(const stack_t *restrict, stack_t *restrict); export int sigdelset(sigset_t *, int); @@ -73,7 +89,18 @@ export int sigemptyset(sigset_t *set) return 0; } -export int sigfillset(sigset_t *); +export int sigfillset(sigset_t *set) +{ + if (set == NULL) + { + errno = EINVAL; + return -1; + } + + *set = ~((sigset_t)0); + return 0; +} + export int sigismember(const sigset_t *, int); export void (*signal(int sig, void (*func)(int)))(int) @@ -91,7 +118,31 @@ export void (*signal(int sig, void (*func)(int)))(int) } export int sigpending(sigset_t *); -export int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict); + +export int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset) +{ + if (how != SIG_BLOCK && how != SIG_UNBLOCK && how != SIG_SETMASK) + { + errno = EINVAL; + return -1; + } + + if (set != NULL) + { + if (how == SIG_BLOCK) + *oset |= *set; + else if (how == SIG_UNBLOCK) + *oset &= ~(*set); + else if (how == SIG_SETMASK) + *oset = *set; + } + + if (oset != NULL) + *oset = *set; + + return 0; +} + export int sigqueue(pid_t, int, union sigval); export int sigsuspend(const sigset_t *); export int sigtimedwait(const sigset_t *restrict, siginfo_t *restrict, const struct timespec *restrict);