1*73610d44SSepherosa Ziehau #include <sys/types.h>
2*73610d44SSepherosa Ziehau #include <sys/socket.h>
3*73610d44SSepherosa Ziehau #include <sys/time.h>
4*73610d44SSepherosa Ziehau #include <sys/un.h>
5*73610d44SSepherosa Ziehau
6*73610d44SSepherosa Ziehau #include <err.h>
7*73610d44SSepherosa Ziehau #include <errno.h>
8*73610d44SSepherosa Ziehau #include <signal.h>
9*73610d44SSepherosa Ziehau #include <stdio.h>
10*73610d44SSepherosa Ziehau #include <stdlib.h>
11*73610d44SSepherosa Ziehau #include <string.h>
12*73610d44SSepherosa Ziehau #include <unistd.h>
13*73610d44SSepherosa Ziehau
14*73610d44SSepherosa Ziehau #define READ_BLOCK_TIME 5 /* unit: sec */
15*73610d44SSepherosa Ziehau
16*73610d44SSepherosa Ziehau static void
sig_alarm(int sig __unused)17*73610d44SSepherosa Ziehau sig_alarm(int sig __unused)
18*73610d44SSepherosa Ziehau {
19*73610d44SSepherosa Ziehau #define PANIC_STRING "read blocks\n"
20*73610d44SSepherosa Ziehau
21*73610d44SSepherosa Ziehau write(2, PANIC_STRING, strlen(PANIC_STRING));
22*73610d44SSepherosa Ziehau abort();
23*73610d44SSepherosa Ziehau }
24*73610d44SSepherosa Ziehau
25*73610d44SSepherosa Ziehau int
main(void)26*73610d44SSepherosa Ziehau main(void)
27*73610d44SSepherosa Ziehau {
28*73610d44SSepherosa Ziehau struct itimerval it;
29*73610d44SSepherosa Ziehau int s[2], n, error;
30*73610d44SSepherosa Ziehau char buf;
31*73610d44SSepherosa Ziehau
32*73610d44SSepherosa Ziehau if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, s) < 0)
33*73610d44SSepherosa Ziehau err(1, "socketpair failed");
34*73610d44SSepherosa Ziehau
35*73610d44SSepherosa Ziehau memset(&it, 0, sizeof(it));
36*73610d44SSepherosa Ziehau it.it_value.tv_sec = READ_BLOCK_TIME;
37*73610d44SSepherosa Ziehau if (signal(SIGALRM, sig_alarm) == SIG_ERR)
38*73610d44SSepherosa Ziehau err(1, "signal failed");
39*73610d44SSepherosa Ziehau if (setitimer(ITIMER_REAL, &it, NULL) < 0)
40*73610d44SSepherosa Ziehau err(1, "setitimer failed");
41*73610d44SSepherosa Ziehau
42*73610d44SSepherosa Ziehau n = read(s[0], &buf, 1);
43*73610d44SSepherosa Ziehau if (n < 0) {
44*73610d44SSepherosa Ziehau error = errno;
45*73610d44SSepherosa Ziehau if (error != EAGAIN) {
46*73610d44SSepherosa Ziehau warnx("invalid errno %d", error);
47*73610d44SSepherosa Ziehau abort();
48*73610d44SSepherosa Ziehau }
49*73610d44SSepherosa Ziehau } else {
50*73610d44SSepherosa Ziehau warnx("read0 works");
51*73610d44SSepherosa Ziehau abort();
52*73610d44SSepherosa Ziehau }
53*73610d44SSepherosa Ziehau
54*73610d44SSepherosa Ziehau n = read(s[1], &buf, 1);
55*73610d44SSepherosa Ziehau if (n < 0) {
56*73610d44SSepherosa Ziehau error = errno;
57*73610d44SSepherosa Ziehau if (error != EAGAIN) {
58*73610d44SSepherosa Ziehau warnx("invalid errno %d", error);
59*73610d44SSepherosa Ziehau abort();
60*73610d44SSepherosa Ziehau }
61*73610d44SSepherosa Ziehau } else {
62*73610d44SSepherosa Ziehau warnx("read1 works");
63*73610d44SSepherosa Ziehau abort();
64*73610d44SSepherosa Ziehau }
65*73610d44SSepherosa Ziehau
66*73610d44SSepherosa Ziehau fprintf(stderr, "passed\n");
67*73610d44SSepherosa Ziehau exit(0);
68*73610d44SSepherosa Ziehau }
69