From bd5969fc876a10b18613302db7087ef3c40f18e1 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Thu, 7 Mar 2024 17:28:00 -0500 Subject: lib: Add mlibc Signed-off-by: Ian Moffett --- lib/mlibc/tests/posix/sigtimedwait.c | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 lib/mlibc/tests/posix/sigtimedwait.c (limited to 'lib/mlibc/tests/posix/sigtimedwait.c') 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 + +#include +#include +#include +#include +#include + +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(); +} -- cgit v1.2.3