1*57718be8SEnji Cooper /* $NetBSD: t_poll.c,v 1.3 2012/03/18 07:00:52 jruoho Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /*- 4*57718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc. 5*57718be8SEnji Cooper * All rights reserved. 6*57718be8SEnji Cooper * 7*57718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 8*57718be8SEnji Cooper * by Matthias Scheler. 9*57718be8SEnji Cooper * 10*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 11*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 12*57718be8SEnji Cooper * are met: 13*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 14*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 15*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 16*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the 17*57718be8SEnji Cooper * documentation and/or other materials provided with the distribution. 18*57718be8SEnji Cooper * 19*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20*57718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21*57718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22*57718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23*57718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*57718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*57718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*57718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*57718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*57718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*57718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 30*57718be8SEnji Cooper */ 31*57718be8SEnji Cooper 32*57718be8SEnji Cooper #include <sys/time.h> 33*57718be8SEnji Cooper #include <sys/wait.h> 34*57718be8SEnji Cooper 35*57718be8SEnji Cooper #include <atf-c.h> 36*57718be8SEnji Cooper #include <errno.h> 37*57718be8SEnji Cooper #include <fcntl.h> 38*57718be8SEnji Cooper #include <paths.h> 39*57718be8SEnji Cooper #include <poll.h> 40*57718be8SEnji Cooper #include <stdio.h> 41*57718be8SEnji Cooper #include <signal.h> 42*57718be8SEnji Cooper #include <unistd.h> 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper static int desc; 45*57718be8SEnji Cooper 46*57718be8SEnji Cooper static void 47*57718be8SEnji Cooper child1(void) 48*57718be8SEnji Cooper { 49*57718be8SEnji Cooper struct pollfd pfd; 50*57718be8SEnji Cooper 51*57718be8SEnji Cooper pfd.fd = desc; 52*57718be8SEnji Cooper pfd.events = POLLIN | POLLHUP | POLLOUT; 53*57718be8SEnji Cooper 54*57718be8SEnji Cooper (void)poll(&pfd, 1, 2000); 55*57718be8SEnji Cooper (void)printf("child1 exit\n"); 56*57718be8SEnji Cooper } 57*57718be8SEnji Cooper 58*57718be8SEnji Cooper static void 59*57718be8SEnji Cooper child2(void) 60*57718be8SEnji Cooper { 61*57718be8SEnji Cooper struct pollfd pfd; 62*57718be8SEnji Cooper 63*57718be8SEnji Cooper pfd.fd = desc; 64*57718be8SEnji Cooper pfd.events = POLLIN | POLLHUP | POLLOUT; 65*57718be8SEnji Cooper 66*57718be8SEnji Cooper (void)sleep(1); 67*57718be8SEnji Cooper (void)poll(&pfd, 1, INFTIM); 68*57718be8SEnji Cooper (void)printf("child2 exit\n"); 69*57718be8SEnji Cooper } 70*57718be8SEnji Cooper 71*57718be8SEnji Cooper static void 72*57718be8SEnji Cooper child3(void) 73*57718be8SEnji Cooper { 74*57718be8SEnji Cooper struct pollfd pfd; 75*57718be8SEnji Cooper 76*57718be8SEnji Cooper (void)sleep(5); 77*57718be8SEnji Cooper 78*57718be8SEnji Cooper pfd.fd = desc; 79*57718be8SEnji Cooper pfd.events = POLLIN | POLLHUP | POLLOUT; 80*57718be8SEnji Cooper 81*57718be8SEnji Cooper (void)poll(&pfd, 1, INFTIM); 82*57718be8SEnji Cooper (void)printf("child3 exit\n"); 83*57718be8SEnji Cooper } 84*57718be8SEnji Cooper 85*57718be8SEnji Cooper ATF_TC(poll_3way); 86*57718be8SEnji Cooper ATF_TC_HEAD(poll_3way, tc) 87*57718be8SEnji Cooper { 88*57718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "15"); 89*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 90*57718be8SEnji Cooper "Check for 3-way collision for descriptor. First child comes " 91*57718be8SEnji Cooper "and polls on descriptor, second child comes and polls, first " 92*57718be8SEnji Cooper "child times out and exits, third child comes and polls. When " 93*57718be8SEnji Cooper "the wakeup event happens, the two remaining children should " 94*57718be8SEnji Cooper "both be awaken. (kern/17517)"); 95*57718be8SEnji Cooper } 96*57718be8SEnji Cooper 97*57718be8SEnji Cooper ATF_TC_BODY(poll_3way, tc) 98*57718be8SEnji Cooper { 99*57718be8SEnji Cooper int pf[2]; 100*57718be8SEnji Cooper int status, i; 101*57718be8SEnji Cooper pid_t pid; 102*57718be8SEnji Cooper 103*57718be8SEnji Cooper pipe(pf); 104*57718be8SEnji Cooper desc = pf[0]; 105*57718be8SEnji Cooper 106*57718be8SEnji Cooper pid = fork(); 107*57718be8SEnji Cooper ATF_REQUIRE(pid >= 0); 108*57718be8SEnji Cooper 109*57718be8SEnji Cooper if (pid == 0) { 110*57718be8SEnji Cooper (void)close(pf[1]); 111*57718be8SEnji Cooper child1(); 112*57718be8SEnji Cooper _exit(0); 113*57718be8SEnji Cooper /* NOTREACHED */ 114*57718be8SEnji Cooper } 115*57718be8SEnji Cooper 116*57718be8SEnji Cooper pid = fork(); 117*57718be8SEnji Cooper ATF_REQUIRE(pid >= 0); 118*57718be8SEnji Cooper 119*57718be8SEnji Cooper if (pid == 0) { 120*57718be8SEnji Cooper (void)close(pf[1]); 121*57718be8SEnji Cooper child2(); 122*57718be8SEnji Cooper _exit(0); 123*57718be8SEnji Cooper /* NOTREACHED */ 124*57718be8SEnji Cooper } 125*57718be8SEnji Cooper 126*57718be8SEnji Cooper pid = fork(); 127*57718be8SEnji Cooper ATF_REQUIRE( pid >= 0); 128*57718be8SEnji Cooper 129*57718be8SEnji Cooper if (pid == 0) { 130*57718be8SEnji Cooper (void)close(pf[1]); 131*57718be8SEnji Cooper child3(); 132*57718be8SEnji Cooper _exit(0); 133*57718be8SEnji Cooper /* NOTREACHED */ 134*57718be8SEnji Cooper } 135*57718be8SEnji Cooper 136*57718be8SEnji Cooper (void)sleep(10); 137*57718be8SEnji Cooper 138*57718be8SEnji Cooper (void)printf("parent write\n"); 139*57718be8SEnji Cooper 140*57718be8SEnji Cooper ATF_REQUIRE(write(pf[1], "konec\n", 6) == 6); 141*57718be8SEnji Cooper 142*57718be8SEnji Cooper for(i = 0; i < 3; ++i) 143*57718be8SEnji Cooper (void)wait(&status); 144*57718be8SEnji Cooper 145*57718be8SEnji Cooper (void)printf("parent terminated\n"); 146*57718be8SEnji Cooper } 147*57718be8SEnji Cooper 148*57718be8SEnji Cooper ATF_TC(poll_basic); 149*57718be8SEnji Cooper ATF_TC_HEAD(poll_basic, tc) 150*57718be8SEnji Cooper { 151*57718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "10"); 152*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 153*57718be8SEnji Cooper "Basis functionality test for poll(2)"); 154*57718be8SEnji Cooper } 155*57718be8SEnji Cooper 156*57718be8SEnji Cooper ATF_TC_BODY(poll_basic, tc) 157*57718be8SEnji Cooper { 158*57718be8SEnji Cooper int fds[2]; 159*57718be8SEnji Cooper struct pollfd pfds[2]; 160*57718be8SEnji Cooper int ret; 161*57718be8SEnji Cooper 162*57718be8SEnji Cooper ATF_REQUIRE_EQ(pipe(fds), 0); 163*57718be8SEnji Cooper 164*57718be8SEnji Cooper pfds[0].fd = fds[0]; 165*57718be8SEnji Cooper pfds[0].events = POLLIN; 166*57718be8SEnji Cooper pfds[1].fd = fds[1]; 167*57718be8SEnji Cooper pfds[1].events = POLLOUT; 168*57718be8SEnji Cooper 169*57718be8SEnji Cooper /* 170*57718be8SEnji Cooper * Check that we get a timeout waiting for data on the read end 171*57718be8SEnji Cooper * of our pipe. 172*57718be8SEnji Cooper */ 173*57718be8SEnji Cooper pfds[0].revents = -1; 174*57718be8SEnji Cooper pfds[1].revents = -1; 175*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = poll(&pfds[0], 1, 1), 0, 176*57718be8SEnji Cooper "got: %d", ret); 177*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents); 178*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, -1, "got: %d", pfds[1].revents); 179*57718be8SEnji Cooper 180*57718be8SEnji Cooper /* Check that the write end of the pipe as reported as ready. */ 181*57718be8SEnji Cooper pfds[0].revents = -1; 182*57718be8SEnji Cooper pfds[1].revents = -1; 183*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = poll(&pfds[1], 1, 1), 1, 184*57718be8SEnji Cooper "got: %d", ret); 185*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, -1, "got: %d", pfds[0].revents); 186*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",\ 187*57718be8SEnji Cooper pfds[1].revents); 188*57718be8SEnji Cooper 189*57718be8SEnji Cooper /* Check that only the write end of the pipe as reported as ready. */ 190*57718be8SEnji Cooper pfds[0].revents = -1; 191*57718be8SEnji Cooper pfds[1].revents = -1; 192*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = poll(pfds, 2, 1), 1, 193*57718be8SEnji Cooper "got: %d", ret); 194*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents); 195*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d", 196*57718be8SEnji Cooper pfds[1].revents); 197*57718be8SEnji Cooper 198*57718be8SEnji Cooper /* Write data to our pipe. */ 199*57718be8SEnji Cooper ATF_REQUIRE_EQ(write(fds[1], "", 1), 1); 200*57718be8SEnji Cooper 201*57718be8SEnji Cooper /* Check that both ends of our pipe are reported as ready. */ 202*57718be8SEnji Cooper pfds[0].revents = -1; 203*57718be8SEnji Cooper pfds[1].revents = -1; 204*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = poll(pfds, 2, 1), 2, 205*57718be8SEnji Cooper "got: %d", ret); 206*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, POLLIN, "got: %d", 207*57718be8SEnji Cooper pfds[0].revents); 208*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d", 209*57718be8SEnji Cooper pfds[1].revents); 210*57718be8SEnji Cooper 211*57718be8SEnji Cooper ATF_REQUIRE_EQ(close(fds[0]), 0); 212*57718be8SEnji Cooper ATF_REQUIRE_EQ(close(fds[1]), 0); 213*57718be8SEnji Cooper } 214*57718be8SEnji Cooper 215*57718be8SEnji Cooper ATF_TC(poll_err); 216*57718be8SEnji Cooper ATF_TC_HEAD(poll_err, tc) 217*57718be8SEnji Cooper { 218*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check errors from poll(2)"); 219*57718be8SEnji Cooper } 220*57718be8SEnji Cooper 221*57718be8SEnji Cooper ATF_TC_BODY(poll_err, tc) 222*57718be8SEnji Cooper { 223*57718be8SEnji Cooper struct pollfd pfd; 224*57718be8SEnji Cooper int fd = 0; 225*57718be8SEnji Cooper 226*57718be8SEnji Cooper pfd.fd = fd; 227*57718be8SEnji Cooper pfd.events = POLLIN; 228*57718be8SEnji Cooper 229*57718be8SEnji Cooper errno = 0; 230*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EFAULT, poll((struct pollfd *)-1, 1, -1) == -1); 231*57718be8SEnji Cooper 232*57718be8SEnji Cooper errno = 0; 233*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EINVAL, poll(&pfd, 1, -2) == -1); 234*57718be8SEnji Cooper } 235*57718be8SEnji Cooper 236*57718be8SEnji Cooper ATF_TC(pollts_basic); 237*57718be8SEnji Cooper ATF_TC_HEAD(pollts_basic, tc) 238*57718be8SEnji Cooper { 239*57718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "10"); 240*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 241*57718be8SEnji Cooper "Basis functionality test for pollts(2)"); 242*57718be8SEnji Cooper } 243*57718be8SEnji Cooper 244*57718be8SEnji Cooper ATF_TC_BODY(pollts_basic, tc) 245*57718be8SEnji Cooper { 246*57718be8SEnji Cooper int fds[2]; 247*57718be8SEnji Cooper struct pollfd pfds[2]; 248*57718be8SEnji Cooper struct timespec timeout; 249*57718be8SEnji Cooper int ret; 250*57718be8SEnji Cooper 251*57718be8SEnji Cooper ATF_REQUIRE_EQ(pipe(fds), 0); 252*57718be8SEnji Cooper 253*57718be8SEnji Cooper pfds[0].fd = fds[0]; 254*57718be8SEnji Cooper pfds[0].events = POLLIN; 255*57718be8SEnji Cooper pfds[1].fd = fds[1]; 256*57718be8SEnji Cooper pfds[1].events = POLLOUT; 257*57718be8SEnji Cooper 258*57718be8SEnji Cooper /* Use a timeout of 1 second. */ 259*57718be8SEnji Cooper timeout.tv_sec = 1; 260*57718be8SEnji Cooper timeout.tv_nsec = 0; 261*57718be8SEnji Cooper 262*57718be8SEnji Cooper /* 263*57718be8SEnji Cooper * Check that we get a timeout waiting for data on the read end 264*57718be8SEnji Cooper * of our pipe. 265*57718be8SEnji Cooper */ 266*57718be8SEnji Cooper pfds[0].revents = -1; 267*57718be8SEnji Cooper pfds[1].revents = -1; 268*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = pollts(&pfds[0], 1, &timeout, NULL), 0, 269*57718be8SEnji Cooper "got: %d", ret); 270*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents); 271*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, -1, "got: %d", pfds[1].revents); 272*57718be8SEnji Cooper 273*57718be8SEnji Cooper /* Check that the write end of the pipe as reported as ready. */ 274*57718be8SEnji Cooper pfds[0].revents = -1; 275*57718be8SEnji Cooper pfds[1].revents = -1; 276*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = pollts(&pfds[1], 1, &timeout, NULL), 1, 277*57718be8SEnji Cooper "got: %d", ret); 278*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, -1, "got: %d", pfds[0].revents); 279*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",\ 280*57718be8SEnji Cooper pfds[1].revents); 281*57718be8SEnji Cooper 282*57718be8SEnji Cooper /* Check that only the write end of the pipe as reported as ready. */ 283*57718be8SEnji Cooper pfds[0].revents = -1; 284*57718be8SEnji Cooper pfds[1].revents = -1; 285*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = pollts(pfds, 2, &timeout, NULL), 1, 286*57718be8SEnji Cooper "got: %d", ret); 287*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents); 288*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d", 289*57718be8SEnji Cooper pfds[1].revents); 290*57718be8SEnji Cooper 291*57718be8SEnji Cooper /* Write data to our pipe. */ 292*57718be8SEnji Cooper ATF_REQUIRE_EQ(write(fds[1], "", 1), 1); 293*57718be8SEnji Cooper 294*57718be8SEnji Cooper /* Check that both ends of our pipe are reported as ready. */ 295*57718be8SEnji Cooper pfds[0].revents = -1; 296*57718be8SEnji Cooper pfds[1].revents = -1; 297*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = pollts(pfds, 2, &timeout, NULL), 2, 298*57718be8SEnji Cooper "got: %d", ret); 299*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[0].revents, POLLIN, "got: %d", 300*57718be8SEnji Cooper pfds[0].revents); 301*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d", 302*57718be8SEnji Cooper pfds[1].revents); 303*57718be8SEnji Cooper 304*57718be8SEnji Cooper ATF_REQUIRE_EQ(close(fds[0]), 0); 305*57718be8SEnji Cooper ATF_REQUIRE_EQ(close(fds[1]), 0); 306*57718be8SEnji Cooper } 307*57718be8SEnji Cooper 308*57718be8SEnji Cooper ATF_TC(pollts_err); 309*57718be8SEnji Cooper ATF_TC_HEAD(pollts_err, tc) 310*57718be8SEnji Cooper { 311*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Check errors from pollts(2)"); 312*57718be8SEnji Cooper } 313*57718be8SEnji Cooper 314*57718be8SEnji Cooper ATF_TC_BODY(pollts_err, tc) 315*57718be8SEnji Cooper { 316*57718be8SEnji Cooper struct timespec timeout; 317*57718be8SEnji Cooper struct pollfd pfd; 318*57718be8SEnji Cooper int fd = 0; 319*57718be8SEnji Cooper 320*57718be8SEnji Cooper pfd.fd = fd; 321*57718be8SEnji Cooper pfd.events = POLLIN; 322*57718be8SEnji Cooper 323*57718be8SEnji Cooper timeout.tv_sec = 1; 324*57718be8SEnji Cooper timeout.tv_nsec = 0; 325*57718be8SEnji Cooper 326*57718be8SEnji Cooper errno = 0; 327*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EFAULT, pollts((void *)-1, 1, &timeout, NULL) == -1); 328*57718be8SEnji Cooper 329*57718be8SEnji Cooper timeout.tv_sec = -1; 330*57718be8SEnji Cooper timeout.tv_nsec = -1; 331*57718be8SEnji Cooper 332*57718be8SEnji Cooper errno = 0; 333*57718be8SEnji Cooper ATF_REQUIRE_ERRNO(EINVAL, pollts(&pfd, 1, &timeout, NULL) == -1); 334*57718be8SEnji Cooper } 335*57718be8SEnji Cooper 336*57718be8SEnji Cooper ATF_TC(pollts_sigmask); 337*57718be8SEnji Cooper ATF_TC_HEAD(pollts_sigmask, tc) 338*57718be8SEnji Cooper { 339*57718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "10"); 340*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", 341*57718be8SEnji Cooper "Check that pollts(2) restores the signal mask (PR kern/44986)"); 342*57718be8SEnji Cooper } 343*57718be8SEnji Cooper 344*57718be8SEnji Cooper ATF_TC_BODY(pollts_sigmask, tc) 345*57718be8SEnji Cooper { 346*57718be8SEnji Cooper int fd; 347*57718be8SEnji Cooper struct pollfd pfd; 348*57718be8SEnji Cooper struct timespec timeout; 349*57718be8SEnji Cooper sigset_t mask; 350*57718be8SEnji Cooper int ret; 351*57718be8SEnji Cooper 352*57718be8SEnji Cooper fd = open(_PATH_DEVNULL, O_RDONLY); 353*57718be8SEnji Cooper ATF_REQUIRE(fd >= 0); 354*57718be8SEnji Cooper 355*57718be8SEnji Cooper pfd.fd = fd; 356*57718be8SEnji Cooper pfd.events = POLLIN; 357*57718be8SEnji Cooper 358*57718be8SEnji Cooper /* Use a timeout of 1 second. */ 359*57718be8SEnji Cooper timeout.tv_sec = 1; 360*57718be8SEnji Cooper timeout.tv_nsec = 0; 361*57718be8SEnji Cooper 362*57718be8SEnji Cooper /* Unblock all signals. */ 363*57718be8SEnji Cooper ATF_REQUIRE_EQ(sigfillset(&mask), 0); 364*57718be8SEnji Cooper ATF_REQUIRE_EQ(sigprocmask(SIG_UNBLOCK, &mask, NULL), 0); 365*57718be8SEnji Cooper 366*57718be8SEnji Cooper /* 367*57718be8SEnji Cooper * Check that pollts(2) immediately returns. We block *all* 368*57718be8SEnji Cooper * signals during pollts(2). 369*57718be8SEnji Cooper */ 370*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(ret = pollts(&pfd, 1, &timeout, &mask), 1, 371*57718be8SEnji Cooper "got: %d", ret); 372*57718be8SEnji Cooper 373*57718be8SEnji Cooper /* Check that signals are now longer blocked. */ 374*57718be8SEnji Cooper ATF_REQUIRE_EQ(sigprocmask(SIG_SETMASK, NULL, &mask), 0); 375*57718be8SEnji Cooper ATF_REQUIRE_EQ_MSG(sigismember(&mask, SIGUSR1), 0, 376*57718be8SEnji Cooper "signal mask was changed."); 377*57718be8SEnji Cooper 378*57718be8SEnji Cooper ATF_REQUIRE_EQ(close(fd), 0); 379*57718be8SEnji Cooper } 380*57718be8SEnji Cooper 381*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 382*57718be8SEnji Cooper { 383*57718be8SEnji Cooper 384*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, poll_3way); 385*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, poll_basic); 386*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, poll_err); 387*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, pollts_basic); 388*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, pollts_err); 389*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, pollts_sigmask); 390*57718be8SEnji Cooper 391*57718be8SEnji Cooper return atf_no_error(); 392*57718be8SEnji Cooper } 393