summaryrefslogtreecommitdiff
path: root/lib/mlibc/tests/posix/sigtimedwait.c
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-03-07 17:28:00 -0500
committerIan Moffett <ian@osmora.org>2024-03-07 17:28:32 -0500
commitbd5969fc876a10b18613302db7087ef3c40f18e1 (patch)
tree7c2b8619afe902abf99570df2873fbdf40a4d1a1 /lib/mlibc/tests/posix/sigtimedwait.c
parenta95b38b1b92b172e6cc4e8e56a88a30cc65907b0 (diff)
lib: Add mlibc
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'lib/mlibc/tests/posix/sigtimedwait.c')
-rw-r--r--lib/mlibc/tests/posix/sigtimedwait.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/mlibc/tests/posix/sigtimedwait.c b/lib/mlibc/tests/posix/sigtimedwait.c
new file mode 100644
index 0000000..4793fc1
--- /dev/null
+++ b/lib/mlibc/tests/posix/sigtimedwait.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+
+#include <assert.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <errno.h>
+
+pid_t parent;
+pid_t child;
+
+int fds[2];
+
+void parent_fn() {
+ int res;
+
+ sigset_t set;
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR2);
+ sigprocmask(SIG_BLOCK, &set, NULL);
+
+ res = write(fds[1], "!", 1);
+ assert(res == 1);
+
+ siginfo_t info;
+ res = sigwaitinfo(&set, &info);
+ assert(res == SIGUSR2);
+ assert(info.si_signo == SIGUSR2);
+
+ res = write(fds[1], "!", 1);
+ assert(res == 1);
+
+ // XXX: This may not be long enough to get scheduled
+ struct timespec tout = {1, 0};
+ res = sigtimedwait(&set, &info, &tout);
+ assert(res == SIGUSR2);
+ assert(info.si_signo == SIGUSR2);
+
+ res = write(fds[1], "!", 1);
+ assert(res == 1);
+
+ int sig;
+ res = sigwait(&set, &sig);
+ assert(res == 0);
+ assert(sig == SIGUSR2);
+
+ res = write(fds[1], "!", 1);
+ assert(res == 1);
+
+ res = sigtimedwait(&set, &info, &tout);
+ assert(res < 0);
+ assert(errno == EAGAIN);
+
+ int wsts;
+ res = waitpid(child, &wsts, 0);
+ assert(res >= 0);
+}
+
+void child_fn() {
+ int res;
+ char c;
+
+ res = read(fds[0], &c, 1);
+ assert(res == 1);
+ kill(parent, SIGUSR2);
+ res = read(fds[0], &c, 1);
+ assert(res == 1);
+ kill(parent, SIGUSR2);
+ res = read(fds[0], &c, 1);
+ assert(res == 1);
+ kill(parent, SIGUSR2);
+ res = read(fds[0], &c, 1);
+ assert(res == 1);
+}
+
+int main() {
+ int res;
+
+ parent = getpid();
+ assert(parent > 0);
+
+ res = pipe(fds);
+ assert(res == 0);
+
+ child = fork();
+ assert(child >= 0);
+ if (child)
+ parent_fn();
+ else
+ child_fn();
+}