1 /*
2 * Rudimentary test suite used while implementing pselect(2).
3 */
4
5 #include <assert.h>
6 #include <errno.h>
7 #include <signal.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <unistd.h>
11
12
13 static int alarm_flag = 0;
14
15
16 static void
nop(int signo)17 nop(int signo)
18 {
19 }
20
21
22 static void
set_alarm_flag(int signo)23 set_alarm_flag(int signo)
24 {
25 alarm_flag = 1;
26 }
27
28
29 /*
30 * Try to detect regressions in select(2).
31 */
32
33 static void
test_select()34 test_select()
35 {
36 fd_set rset;
37 fd_set wset;
38 struct timeval timeout;
39 int des[2];
40 int r;
41 char buf[1];
42
43 printf("test_select\n");
44
45 /*
46 * It is always possible to write to stdout (if not redirected).
47 */
48
49 FD_ZERO(&wset);
50 FD_SET(1, &wset);
51
52 r = select(2, NULL, &wset, NULL, NULL);
53 assert(r == 1);
54 assert(FD_ISSET(1, &wset));
55
56 /*
57 * Write to a pipe and check a select on the read end does not block.
58 */
59
60 r = pipe(des);
61 assert(r == 0);
62
63 FD_ZERO(&rset);
64 FD_SET(des[0], &rset);
65
66 buf[0] = 'f';
67 r = write(des[1], buf, 1);
68 assert(r == 1);
69
70 r = select(des[0]+1, &rset, NULL, NULL, NULL);
71 assert(r == 1);
72 assert(FD_ISSET(des[0], &rset));
73
74 r = read(des[0], buf, 1);
75 assert(r == 1);
76 assert(buf[0] == 'f');
77
78 /*
79 * Block until signal reception.
80 */
81
82 signal(SIGALRM, nop);
83 alarm(1);
84
85 FD_ZERO(&rset);
86 FD_SET(des[0], &rset);
87
88 r = select(des[0]+1, &rset, NULL, NULL, NULL);
89 assert(r == -1);
90 assert(errno == EINTR);
91
92 /*
93 * Block until timeout.
94 */
95
96 FD_ZERO(&rset);
97 FD_SET(des[0], &rset);
98
99 timeout.tv_sec = 1;
100 timeout.tv_usec = 0;
101 r = select(des[0]+1, &rset, NULL, NULL, &timeout);
102 assert(r == 0);
103
104 /*
105 * When the timeout is zero, the call should not block.
106 */
107
108 timeout.tv_sec = 0;
109 timeout.tv_usec = 0;
110 FD_ZERO(&rset);
111 FD_SET(des[0], &rset);
112
113 r = select(des[0]+1, &rset, NULL, NULL, &timeout);
114 assert(r == 0);
115
116 close(des[0]);
117 close(des[1]);
118 }
119
120 int
main(void)121 main(void)
122 {
123 test_select();
124 return (0);
125 }
126