From 21d3cf91a01f4077f3f73e012637c80962902429 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 28 Jan 2025 17:19:21 +0200 Subject: [PATCH] LibC: Implement some missing signal.h functions --- userspace/libraries/LibC/signal.cpp | 71 +++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/userspace/libraries/LibC/signal.cpp b/userspace/libraries/LibC/signal.cpp index 991fbce2..f8a1f1d1 100644 --- a/userspace/libraries/LibC/signal.cpp +++ b/userspace/libraries/LibC/signal.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -6,11 +7,29 @@ static_assert(sizeof(sigset_t) * 8 >= _SIGMAX); +static int validate_signal(int sig) +{ + if (_SIGMIN <= sig && sig <= _SIGMAX) + return 0; + errno = EINVAL; + return -1; +} + int kill(pid_t pid, int sig) { return syscall(SYS_KILL, pid, sig); } +int killpg(pid_t pgrp, int sig) +{ + if (pgrp <= 1) + { + errno = EINVAL; + return -1; + } + return kill(-pgrp, sig); +} + void psignal(int signum, const char* message) { if (message && *message) @@ -37,10 +56,20 @@ int sigaction(int sig, const struct sigaction* __restrict act, struct sigaction* int sigaddset(sigset_t* set, int signo) { + if (validate_signal(signo) == -1) + return -1; *set |= 1ull << signo; return 0; } +int sigdelset(sigset_t* set, int signo) +{ + if (validate_signal(signo) == -1) + return -1; + *set &= ~(1ull << signo); + return 0; +} + int sigemptyset(sigset_t* set) { *set = 0; @@ -53,8 +82,40 @@ int sigfillset(sigset_t* set) return 0; } +int sighold(int sig) +{ + if (validate_signal(sig) == -1) + return -1; + sigset_t set; + (void)sigemptyset(&set); + (void)sigaddset(&set, sig); + return sigprocmask(SIG_BLOCK, &set, nullptr); +} + +int sigignore(int sig) +{ + if (signal(sig, SIG_IGN) == SIG_ERR) + return -1; + return 0; +} + +int siginterrupt(int sig, int flag) +{ + if (validate_signal(sig) == -1) + return -1; + struct sigaction act; + (void)sigaction(sig, nullptr, &act); + if (flag) + act.sa_flags &= ~SA_RESTART; + else + act.sa_flags |= SA_RESTART; + return sigaction(sig, &act, nullptr); +} + int sigismember(const sigset_t* set, int signo) { + if (validate_signal(signo) == -1) + return -1; return (*set >> signo) & 1; } @@ -79,3 +140,13 @@ int sigprocmask(int how, const sigset_t* __restrict set, sigset_t* __restrict os { return pthread_sigmask(how, set, oset); } + +int sigrelse(int sig) +{ + if (validate_signal(sig) == -1) + return -1; + sigset_t set; + (void)sigemptyset(&set); + (void)sigaddset(&set, sig); + return sigprocmask(SIG_UNBLOCK, &set, nullptr); +}