From f064b8b87c160bc70e97fedb4789966ce877cab3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 18 Nov 2023 19:36:58 +0100 Subject: [PATCH 1/2] options/posix: implement sigpending --- options/posix/generic/posix_signal.cpp | 12 +++++++++--- options/posix/include/mlibc/posix-sysdeps.hpp | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/options/posix/generic/posix_signal.cpp b/options/posix/generic/posix_signal.cpp index c1c0529033..eef3ef391a 100644 --- a/options/posix/generic/posix_signal.cpp +++ b/options/posix/generic/posix_signal.cpp @@ -112,9 +112,15 @@ int sigwait(const sigset_t *__restrict set, int *__restrict sig) { } } -int sigpending(sigset_t *) { - __ensure(!"sigpending() not implemented"); - __builtin_unreachable(); +int sigpending(sigset_t *set) { + auto sysdep = MLIBC_CHECK_OR_ENOSYS(mlibc::sys_sigpending, -1); + + if(int e = sysdep(set)) { + errno = e; + return -1; + } + + return 0; } int sigaltstack(const stack_t *__restrict ss, stack_t *__restrict oss) { diff --git a/options/posix/include/mlibc/posix-sysdeps.hpp b/options/posix/include/mlibc/posix-sysdeps.hpp index 730bf599d4..0c485cec55 100644 --- a/options/posix/include/mlibc/posix-sysdeps.hpp +++ b/options/posix/include/mlibc/posix-sysdeps.hpp @@ -189,6 +189,7 @@ int sys_vm_unmap(void *pointer, size_t size); [[gnu::weak]] int sys_fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags); [[gnu::weak]] int sys_sigaltstack(const stack_t *ss, stack_t *oss); [[gnu::weak]] int sys_sigsuspend(const sigset_t *set); +[[gnu::weak]] int sys_sigpending(sigset_t *set); [[gnu::weak]] int sys_setgroups(size_t size, const gid_t *list); [[gnu::weak]] int sys_statfs(const char *path, struct statfs *buf); [[gnu::weak]] int sys_fstatfs(int fd, struct statfs *buf); From afae964cd460f54235bec8aa591bf9ebe1ec499c Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 18 Nov 2023 19:37:11 +0100 Subject: [PATCH 2/2] sysdeps/managarm: implement sigpending --- sysdeps/managarm/generic/signals.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sysdeps/managarm/generic/signals.cpp b/sysdeps/managarm/generic/signals.cpp index f81918212f..486f3d439f 100644 --- a/sysdeps/managarm/generic/signals.cpp +++ b/sysdeps/managarm/generic/signals.cpp @@ -127,4 +127,13 @@ int sys_sigsuspend(const sigset_t *set) { return EINTR; } +int sys_sigpending(sigset_t *set) { + uint64_t pendingMask; + + HEL_CHECK(helSyscall0_1(kHelObserveSuperCall + posix::superSigGetPending, &pendingMask)); + *set = pendingMask; + + return 0; +} + } //namespace mlibc