1*2b613d4dSvisa /* $OpenBSD: select_regevent.c,v 1.1 2021/11/29 16:11:46 visa Exp $ */
2*2b613d4dSvisa
3*2b613d4dSvisa /*
4*2b613d4dSvisa * Copyright (c) 2021 Visa Hankala
5*2b613d4dSvisa *
6*2b613d4dSvisa * Permission to use, copy, modify, and distribute this software for any
7*2b613d4dSvisa * purpose with or without fee is hereby granted, provided that the above
8*2b613d4dSvisa * copyright notice and this permission notice appear in all copies.
9*2b613d4dSvisa *
10*2b613d4dSvisa * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*2b613d4dSvisa * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*2b613d4dSvisa * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*2b613d4dSvisa * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*2b613d4dSvisa * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*2b613d4dSvisa * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*2b613d4dSvisa * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*2b613d4dSvisa */
18*2b613d4dSvisa
19*2b613d4dSvisa /*
20*2b613d4dSvisa * Test that poll/select does not block if a pending event is found
21*2b613d4dSvisa * during registering.
22*2b613d4dSvisa */
23*2b613d4dSvisa
24*2b613d4dSvisa #include <sys/select.h>
25*2b613d4dSvisa #include <assert.h>
26*2b613d4dSvisa #include <err.h>
27*2b613d4dSvisa #include <unistd.h>
28*2b613d4dSvisa
29*2b613d4dSvisa int
main(void)30*2b613d4dSvisa main(void)
31*2b613d4dSvisa {
32*2b613d4dSvisa fd_set rfd;
33*2b613d4dSvisa fd_set wfd;
34*2b613d4dSvisa int p1[2];
35*2b613d4dSvisa int p2[2];
36*2b613d4dSvisa int ret;
37*2b613d4dSvisa
38*2b613d4dSvisa /* Enforce test timeout. */
39*2b613d4dSvisa alarm(10);
40*2b613d4dSvisa
41*2b613d4dSvisa if (pipe(p1) == -1)
42*2b613d4dSvisa err(1, "pipe");
43*2b613d4dSvisa if (pipe(p2) == -1)
44*2b613d4dSvisa err(1, "pipe");
45*2b613d4dSvisa
46*2b613d4dSvisa close(p2[0]);
47*2b613d4dSvisa
48*2b613d4dSvisa /* fd without event */
49*2b613d4dSvisa FD_ZERO(&rfd);
50*2b613d4dSvisa FD_SET(p1[0], &rfd);
51*2b613d4dSvisa
52*2b613d4dSvisa /* fd with event */
53*2b613d4dSvisa FD_ZERO(&wfd);
54*2b613d4dSvisa FD_SET(p2[1], &wfd);
55*2b613d4dSvisa
56*2b613d4dSvisa assert(p1[0] < p2[1]);
57*2b613d4dSvisa
58*2b613d4dSvisa ret = select(p2[1] + 1, &rfd, &wfd, NULL, NULL);
59*2b613d4dSvisa assert(ret == 1);
60*2b613d4dSvisa assert(FD_ISSET(p1[0], &rfd) == 0);
61*2b613d4dSvisa assert(FD_ISSET(p2[1], &wfd) != 0);
62*2b613d4dSvisa
63*2b613d4dSvisa return 0;
64*2b613d4dSvisa }
65