1152155Sdavidxu/* $FreeBSD$ */
2197965Skib#include <err.h>
3197965Skib#include <errno.h>
4152155Sdavidxu#include <signal.h>
5152155Sdavidxu#include <stdio.h>
6197965Skib#include <unistd.h>
7152155Sdavidxu
8152155Sdavidxuint received;
9152155Sdavidxu
10197965Skibvoid
11197965Skibhandler(int sig, siginfo_t *si, void *ctx)
12152155Sdavidxu{
13152155Sdavidxu	if (si->si_code != SI_QUEUE)
14152155Sdavidxu		errx(1, "si_code != SI_QUEUE");
15152155Sdavidxu	if (si->si_value.sival_int != received)
16152155Sdavidxu		errx(1, "signal is out of order");
17152155Sdavidxu	received++;
18152155Sdavidxu}
19152155Sdavidxu
20197965Skibint
21197965Skibmain()
22152155Sdavidxu{
23152155Sdavidxu	struct sigaction sa;
24152155Sdavidxu	union sigval val;
25152155Sdavidxu	int ret;
26152155Sdavidxu	int i;
27152155Sdavidxu	sigset_t set;
28152155Sdavidxu
29152155Sdavidxu	sa.sa_flags = SA_SIGINFO;
30152155Sdavidxu	sigemptyset(&sa.sa_mask);
31152155Sdavidxu	sa.sa_sigaction = handler;
32152155Sdavidxu	sigaction(SIGRTMIN, &sa, NULL);
33152155Sdavidxu	sigemptyset(&set);
34152155Sdavidxu	sigaddset(&set, SIGRTMIN);
35152155Sdavidxu	sigprocmask(SIG_BLOCK, &set, NULL);
36152155Sdavidxu	i = 0;
37152155Sdavidxu	for (;;) {
38152155Sdavidxu		val.sival_int = i;
39152155Sdavidxu		ret = sigqueue(getpid(), SIGRTMIN, val);
40152155Sdavidxu		if (ret == -1) {
41152155Sdavidxu			if (errno != EAGAIN) {
42152155Sdavidxu				errx(1, "errno != EAGAIN");
43152155Sdavidxu			}
44152155Sdavidxu			break;
45152155Sdavidxu		}
46152155Sdavidxu		i++;
47152155Sdavidxu	}
48152155Sdavidxu	sigprocmask(SIG_UNBLOCK, &set, NULL);
49152155Sdavidxu	if (received != i)
50152155Sdavidxu		errx(1, "error, signal lost");
51152155Sdavidxu	printf("OK\n");
52152155Sdavidxu}
53