diff options
-rw-r--r-- | tools/regression/sigqueue/Makefile | 5 | ||||
-rw-r--r-- | tools/regression/sigqueue/sigqtest1/Makefile | 8 | ||||
-rw-r--r-- | tools/regression/sigqueue/sigqtest1/sigqtest1.c | 49 |
3 files changed, 62 insertions, 0 deletions
diff --git a/tools/regression/sigqueue/Makefile b/tools/regression/sigqueue/Makefile new file mode 100644 index 0000000..d3046c4 --- /dev/null +++ b/tools/regression/sigqueue/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +SUBDIR=sigqtest1 + +.include <bsd.subdir.mk> diff --git a/tools/regression/sigqueue/sigqtest1/Makefile b/tools/regression/sigqueue/sigqtest1/Makefile new file mode 100644 index 0000000..08a140c --- /dev/null +++ b/tools/regression/sigqueue/sigqtest1/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG=sigqtest1 +LDADD+= +NO_MAN= +DEBUG_FLAGS=-g + +.include <bsd.prog.mk> diff --git a/tools/regression/sigqueue/sigqtest1/sigqtest1.c b/tools/regression/sigqueue/sigqtest1/sigqtest1.c new file mode 100644 index 0000000..0f40021 --- /dev/null +++ b/tools/regression/sigqueue/sigqtest1/sigqtest1.c @@ -0,0 +1,49 @@ +/* $FreeBSD$ */ +#include <signal.h> +#include <stdio.h> +#include <err.h> +#include <errno.h> + +int received; + +void handler(int sig, siginfo_t *si, void *ctx) +{ + if (si->si_code != SI_QUEUE) + errx(1, "si_code != SI_QUEUE"); + if (si->si_value.sival_int != received) + errx(1, "signal is out of order"); + received++; +} + +int main() +{ + struct sigaction sa; + union sigval val; + int ret; + int i; + sigset_t set; + + sa.sa_flags = SA_SIGINFO; + sigemptyset(&sa.sa_mask); + sa.sa_sigaction = handler; + sigaction(SIGRTMIN, &sa, NULL); + sigemptyset(&set); + sigaddset(&set, SIGRTMIN); + sigprocmask(SIG_BLOCK, &set, NULL); + i = 0; + for (;;) { + val.sival_int = i; + ret = sigqueue(getpid(), SIGRTMIN, val); + if (ret == -1) { + if (errno != EAGAIN) { + errx(1, "errno != EAGAIN"); + } + break; + } + i++; + } + sigprocmask(SIG_UNBLOCK, &set, NULL); + if (received != i) + errx(1, "error, signal lost"); + printf("OK\n"); +} |