xref: /dflybsd-src/test/testcases/io/select_1/select_1.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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