1 /*
2 * Copyright (c) International Business Machines Corp., 2001
3 * 07/2001 Ported by Wayne Boyer
4 * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14 * the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /*
22 * Check that poll() works for POLLOUT and POLLIN and that revents is set
23 * correctly.
24 */
25 #include <unistd.h>
26 #include <errno.h>
27 #include <fcntl.h>
28 #include <sys/wait.h>
29 #include <sys/poll.h>
30
31 #include "test.h"
32 #include "safe_macros.h"
33
34 #define BUF_SIZE 512
35
36 char *TCID = "poll01";
37 int TST_TOTAL = 2;
38
39 static int fildes[2];
40
41 static void setup(void);
42 static void cleanup(void);
43
verify_pollout(void)44 static void verify_pollout(void)
45 {
46 struct pollfd outfds[] = {
47 {.fd = fildes[1], .events = POLLOUT},
48 };
49
50 TEST(poll(outfds, 1, -1));
51
52 if (TEST_RETURN == -1) {
53 tst_resm(TFAIL | TTERRNO, "poll() POLLOUT failed");
54 return;
55 }
56
57 if (outfds[0].revents != POLLOUT) {
58 tst_resm(TFAIL | TTERRNO, "poll() failed to set POLLOUT");
59 return;
60 }
61
62 tst_resm(TPASS, "poll() POLLOUT");
63 }
64
verify_pollin(void)65 static void verify_pollin(void)
66 {
67 char write_buf[] = "Testing";
68 char read_buf[BUF_SIZE];
69
70 struct pollfd infds[] = {
71 {.fd = fildes[0], .events = POLLIN},
72 };
73
74 SAFE_WRITE(cleanup, 1, fildes[1], write_buf, sizeof(write_buf));
75
76 TEST(poll(infds, 1, -1));
77
78 if (TEST_RETURN == -1) {
79 tst_resm(TFAIL | TTERRNO, "poll() POLLIN failed");
80 goto end;
81 }
82
83 if (infds[0].revents != POLLIN) {
84 tst_resm(TFAIL, "poll() failed to set POLLIN");
85 goto end;
86 }
87
88
89 tst_resm(TPASS, "poll() POLLIN");
90
91 end:
92 SAFE_READ(cleanup, 1, fildes[0], read_buf, sizeof(write_buf));
93 }
94
main(int ac,char ** av)95 int main(int ac, char **av)
96 {
97 int lc;
98
99 tst_parse_opts(ac, av, NULL, NULL);
100
101 setup();
102
103 for (lc = 0; TEST_LOOPING(lc); lc++) {
104 verify_pollout();
105 verify_pollin();
106 }
107
108 cleanup();
109 tst_exit();
110 }
111
setup(void)112 static void setup(void)
113 {
114 tst_sig(FORK, DEF_HANDLER, cleanup);
115
116 TEST_PAUSE;
117
118 SAFE_PIPE(NULL, fildes);
119 }
120
cleanup(void)121 static void cleanup(void)
122 {
123 if (close(fildes[0]))
124 tst_resm(TWARN | TERRNO, "failed to close fildes[0]");
125
126 if (close(fildes[1]))
127 tst_resm(TWARN | TERRNO, "failed to close fildes[1]");
128 }
129