186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino * Rudimentary test suite used while implementing pselect(2).
386d7f5d3SJohn Marino */
486d7f5d3SJohn Marino
586d7f5d3SJohn Marino #include <assert.h>
686d7f5d3SJohn Marino #include <errno.h>
786d7f5d3SJohn Marino #include <signal.h>
886d7f5d3SJohn Marino #include <stdio.h>
986d7f5d3SJohn Marino #include <string.h>
1086d7f5d3SJohn Marino #include <unistd.h>
1186d7f5d3SJohn Marino
1286d7f5d3SJohn Marino
1386d7f5d3SJohn Marino static int alarm_flag = 0;
1486d7f5d3SJohn Marino
1586d7f5d3SJohn Marino
1686d7f5d3SJohn Marino static void
nop(int signo)1786d7f5d3SJohn Marino nop(int signo)
1886d7f5d3SJohn Marino {
1986d7f5d3SJohn Marino }
2086d7f5d3SJohn Marino
2186d7f5d3SJohn Marino
2286d7f5d3SJohn Marino static void
set_alarm_flag(int signo)2386d7f5d3SJohn Marino set_alarm_flag(int signo)
2486d7f5d3SJohn Marino {
2586d7f5d3SJohn Marino alarm_flag = 1;
2686d7f5d3SJohn Marino }
2786d7f5d3SJohn Marino
2886d7f5d3SJohn Marino
2986d7f5d3SJohn Marino /*
3086d7f5d3SJohn Marino * Try to detect regressions in select(2).
3186d7f5d3SJohn Marino */
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino static void
test_select()3486d7f5d3SJohn Marino test_select()
3586d7f5d3SJohn Marino {
3686d7f5d3SJohn Marino fd_set rset;
3786d7f5d3SJohn Marino fd_set wset;
3886d7f5d3SJohn Marino struct timeval timeout;
3986d7f5d3SJohn Marino int des[2];
4086d7f5d3SJohn Marino int r;
4186d7f5d3SJohn Marino char buf[1];
4286d7f5d3SJohn Marino
4386d7f5d3SJohn Marino printf("test_select\n");
4486d7f5d3SJohn Marino
4586d7f5d3SJohn Marino /*
4686d7f5d3SJohn Marino * It is always possible to write to stdout (if not redirected).
4786d7f5d3SJohn Marino */
4886d7f5d3SJohn Marino
4986d7f5d3SJohn Marino FD_ZERO(&wset);
5086d7f5d3SJohn Marino FD_SET(1, &wset);
5186d7f5d3SJohn Marino
5286d7f5d3SJohn Marino r = select(2, NULL, &wset, NULL, NULL);
5386d7f5d3SJohn Marino assert(r == 1);
5486d7f5d3SJohn Marino assert(FD_ISSET(1, &wset));
5586d7f5d3SJohn Marino
5686d7f5d3SJohn Marino /*
5786d7f5d3SJohn Marino * Write to a pipe and check a select on the read end does not block.
5886d7f5d3SJohn Marino */
5986d7f5d3SJohn Marino
6086d7f5d3SJohn Marino r = pipe(des);
6186d7f5d3SJohn Marino assert(r == 0);
6286d7f5d3SJohn Marino
6386d7f5d3SJohn Marino FD_ZERO(&rset);
6486d7f5d3SJohn Marino FD_SET(des[0], &rset);
6586d7f5d3SJohn Marino
6686d7f5d3SJohn Marino buf[0] = 'f';
6786d7f5d3SJohn Marino r = write(des[1], buf, 1);
6886d7f5d3SJohn Marino assert(r == 1);
6986d7f5d3SJohn Marino
7086d7f5d3SJohn Marino r = select(des[0]+1, &rset, NULL, NULL, NULL);
7186d7f5d3SJohn Marino assert(r == 1);
7286d7f5d3SJohn Marino assert(FD_ISSET(des[0], &rset));
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marino r = read(des[0], buf, 1);
7586d7f5d3SJohn Marino assert(r == 1);
7686d7f5d3SJohn Marino assert(buf[0] == 'f');
7786d7f5d3SJohn Marino
7886d7f5d3SJohn Marino /*
7986d7f5d3SJohn Marino * Block until signal reception.
8086d7f5d3SJohn Marino */
8186d7f5d3SJohn Marino
8286d7f5d3SJohn Marino signal(SIGALRM, nop);
8386d7f5d3SJohn Marino alarm(1);
8486d7f5d3SJohn Marino
8586d7f5d3SJohn Marino FD_ZERO(&rset);
8686d7f5d3SJohn Marino FD_SET(des[0], &rset);
8786d7f5d3SJohn Marino
8886d7f5d3SJohn Marino r = select(des[0]+1, &rset, NULL, NULL, NULL);
8986d7f5d3SJohn Marino assert(r == -1);
9086d7f5d3SJohn Marino assert(errno == EINTR);
9186d7f5d3SJohn Marino
9286d7f5d3SJohn Marino /*
9386d7f5d3SJohn Marino * Block until timeout.
9486d7f5d3SJohn Marino */
9586d7f5d3SJohn Marino
9686d7f5d3SJohn Marino FD_ZERO(&rset);
9786d7f5d3SJohn Marino FD_SET(des[0], &rset);
9886d7f5d3SJohn Marino
9986d7f5d3SJohn Marino timeout.tv_sec = 1;
10086d7f5d3SJohn Marino timeout.tv_usec = 0;
10186d7f5d3SJohn Marino r = select(des[0]+1, &rset, NULL, NULL, &timeout);
10286d7f5d3SJohn Marino assert(r == 0);
10386d7f5d3SJohn Marino
10486d7f5d3SJohn Marino /*
10586d7f5d3SJohn Marino * When the timeout is zero, the call should not block.
10686d7f5d3SJohn Marino */
10786d7f5d3SJohn Marino
10886d7f5d3SJohn Marino timeout.tv_sec = 0;
10986d7f5d3SJohn Marino timeout.tv_usec = 0;
11086d7f5d3SJohn Marino FD_ZERO(&rset);
11186d7f5d3SJohn Marino FD_SET(des[0], &rset);
11286d7f5d3SJohn Marino
11386d7f5d3SJohn Marino r = select(des[0]+1, &rset, NULL, NULL, &timeout);
11486d7f5d3SJohn Marino assert(r == 0);
11586d7f5d3SJohn Marino
11686d7f5d3SJohn Marino close(des[0]);
11786d7f5d3SJohn Marino close(des[1]);
11886d7f5d3SJohn Marino }
11986d7f5d3SJohn Marino
12086d7f5d3SJohn Marino int
main(void)12186d7f5d3SJohn Marino main(void)
12286d7f5d3SJohn Marino {
12386d7f5d3SJohn Marino test_select();
12486d7f5d3SJohn Marino return (0);
12586d7f5d3SJohn Marino }
126