Bläddra i källkod

LibC: Implement sigwait()

This is done internally by just calling the more modern sigtimedwait
syscall and then massaging the results to fit sigwait's interface.
Idan Horowitz 3 år sedan
förälder
incheckning
656b1dd6be
2 ändrade filer med 12 tillägg och 0 borttagningar
  1. 11 0
      Userland/Libraries/LibC/signal.cpp
  2. 1 0
      Userland/Libraries/LibC/signal.h

+ 11 - 0
Userland/Libraries/LibC/signal.cpp

@@ -163,6 +163,17 @@ int sigsuspend(const sigset_t* set)
     return pselect(0, nullptr, nullptr, nullptr, nullptr, set);
 }
 
+// https://pubs.opengroup.org/onlinepubs/009604499/functions/sigwait.html
+int sigwait(sigset_t const* set, int* sig)
+{
+    int rc = syscall(Syscall::SC_sigtimedwait, set, nullptr, nullptr);
+    VERIFY(rc != 0);
+    if (rc < 0)
+        return -rc;
+    *sig = rc;
+    return 0;
+}
+
 // https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwaitinfo.html
 int sigwaitinfo(sigset_t const* set, siginfo_t* info)
 {

+ 1 - 0
Userland/Libraries/LibC/signal.h

@@ -28,6 +28,7 @@ int sigprocmask(int how, const sigset_t* set, sigset_t* old_set);
 int sigpending(sigset_t*);
 int sigsuspend(const sigset_t*);
 int sigtimedwait(sigset_t const*, siginfo_t*, struct timespec const*);
+int sigwait(sigset_t const*, int*);
 int sigwaitinfo(sigset_t const*, siginfo_t*);
 int raise(int sig);
 int getsignalbyname(const char*);