Home | History | Annotate | Line # | Download | only in sys
t_poll.c revision 1.11
      1 /*	$NetBSD: t_poll.c,v 1.11 2025/02/09 17:10:37 riastradh Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Matthias Scheler.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/socket.h>
     33 #include <sys/stat.h>
     34 #include <sys/time.h>
     35 #include <sys/wait.h>
     36 
     37 #include <atf-c.h>
     38 #include <errno.h>
     39 #include <fcntl.h>
     40 #include <paths.h>
     41 #include <poll.h>
     42 #include <pthread.h>
     43 #include <stdio.h>
     44 #include <stdlib.h>
     45 #include <signal.h>
     46 #include <unistd.h>
     47 
     48 #include "h_macros.h"
     49 
     50 static int desc;
     51 
     52 static void
     53 child1(void)
     54 {
     55 	struct pollfd pfd;
     56 
     57 	pfd.fd = desc;
     58 	pfd.events = POLLIN | POLLHUP | POLLOUT;
     59 
     60 	(void)poll(&pfd, 1, 2000);
     61 	(void)printf("child1 exit\n");
     62 }
     63 
     64 static void
     65 child2(void)
     66 {
     67 	struct pollfd pfd;
     68 
     69 	pfd.fd = desc;
     70 	pfd.events = POLLIN | POLLHUP | POLLOUT;
     71 
     72 	(void)sleep(1);
     73 	(void)poll(&pfd, 1, INFTIM);
     74 	(void)printf("child2 exit\n");
     75 }
     76 
     77 static void
     78 child3(void)
     79 {
     80 	struct pollfd pfd;
     81 
     82 	(void)sleep(5);
     83 
     84 	pfd.fd = desc;
     85 	pfd.events = POLLIN | POLLHUP | POLLOUT;
     86 
     87 	(void)poll(&pfd, 1, INFTIM);
     88 	(void)printf("child3 exit\n");
     89 }
     90 
     91 ATF_TC(3way);
     92 ATF_TC_HEAD(3way, tc)
     93 {
     94 	atf_tc_set_md_var(tc, "timeout", "15");
     95 	atf_tc_set_md_var(tc, "descr",
     96 	    "Check for 3-way collision for descriptor. First child comes "
     97 	    "and polls on descriptor, second child comes and polls, first "
     98 	    "child times out and exits, third child comes and polls. When "
     99 	    "the wakeup event happens, the two remaining children should "
    100 	    "both be awaken. (kern/17517)");
    101 }
    102 
    103 ATF_TC_BODY(3way, tc)
    104 {
    105 	int pf[2];
    106 	int status, i;
    107 	pid_t pid;
    108 	ssize_t nwrit;
    109 
    110 	RL(pipe(pf));
    111 	desc = pf[0];
    112 
    113 	RL(pid = fork());
    114 	if (pid == 0) {
    115 		if (close(pf[1]) == -1)
    116 			_exit(1);
    117 		child1();
    118 		_exit(0);
    119 		/* NOTREACHED */
    120 	}
    121 
    122 	RL(pid = fork());
    123 	if (pid == 0) {
    124 		if (close(pf[1]) == -1)
    125 			_exit(1);
    126 		child2();
    127 		_exit(0);
    128 		/* NOTREACHED */
    129 	}
    130 
    131 	RL(pid = fork());
    132 	if (pid == 0) {
    133 		if (close(pf[1]) == -1)
    134 			_exit(1);
    135 		child3();
    136 		_exit(0);
    137 		/* NOTREACHED */
    138 	}
    139 
    140 	(void)sleep(10);
    141 
    142 	(void)printf("parent write\n");
    143 
    144 	RL(nwrit = write(pf[1], "konec\n", 6));
    145 	ATF_REQUIRE_EQ_MSG(nwrit, 6, "nwrit=%zd", nwrit);
    146 
    147 	for (i = 0; i < 3; i++)
    148 		RL(wait(&status));
    149 
    150 	(void)printf("parent terminated\n");
    151 }
    152 
    153 ATF_TC(basic);
    154 ATF_TC_HEAD(basic, tc)
    155 {
    156 	atf_tc_set_md_var(tc, "timeout", "10");
    157 	atf_tc_set_md_var(tc, "descr",
    158 	    "Basis functionality test for poll(2)");
    159 }
    160 
    161 ATF_TC_BODY(basic, tc)
    162 {
    163 	int fds[2];
    164 	struct pollfd pfds[2];
    165 	int ret;
    166 	ssize_t nwrit;
    167 
    168 	RL(pipe(fds));
    169 
    170 	pfds[0].fd = fds[0];
    171 	pfds[0].events = POLLIN;
    172 	pfds[1].fd = fds[1];
    173 	pfds[1].events = POLLOUT;
    174 
    175 	/*
    176 	 * Check that we get a timeout waiting for data on the read end
    177 	 * of our pipe.
    178 	 */
    179 	pfds[0].revents = -1;
    180 	pfds[1].revents = -1;
    181 	RL(ret = poll(&pfds[0], 1, 1));
    182 	ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
    183 	ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
    184 	ATF_REQUIRE_EQ_MSG(pfds[1].revents, -1, "got: %d", pfds[1].revents);
    185 
    186 	/* Check that the write end of the pipe as reported as ready. */
    187 	pfds[0].revents = -1;
    188 	pfds[1].revents = -1;
    189 	RL(ret = poll(&pfds[1], 1, 1));
    190 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    191 	ATF_REQUIRE_EQ_MSG(pfds[0].revents, -1, "got: %d", pfds[0].revents);
    192 	ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",\
    193 	    pfds[1].revents);
    194 
    195 	/* Check that only the write end of the pipe as reported as ready. */
    196 	pfds[0].revents = -1;
    197 	pfds[1].revents = -1;
    198 	RL(ret = poll(pfds, 2, 1));
    199 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    200 	ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
    201 	ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
    202 	    pfds[1].revents);
    203 
    204 	/* Write data to our pipe. */
    205 	RL(nwrit = write(fds[1], "", 1));
    206 	ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
    207 
    208 	/* Check that both ends of our pipe are reported as ready. */
    209 	pfds[0].revents = -1;
    210 	pfds[1].revents = -1;
    211 	RL(ret = poll(pfds, 2, 1));
    212 	ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
    213 	ATF_REQUIRE_EQ_MSG(pfds[0].revents, POLLIN, "got: %d",
    214 	    pfds[0].revents);
    215 	ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
    216 	    pfds[1].revents);
    217 
    218 	RL(close(fds[0]));
    219 	RL(close(fds[1]));
    220 }
    221 
    222 ATF_TC(err);
    223 ATF_TC_HEAD(err, tc)
    224 {
    225 	atf_tc_set_md_var(tc, "descr", "Check errors from poll(2)");
    226 }
    227 
    228 ATF_TC_BODY(err, tc)
    229 {
    230 	struct pollfd pfd;
    231 	int fd = 0;
    232 
    233 	pfd.fd = fd;
    234 	pfd.events = POLLIN;
    235 
    236 	errno = 0;
    237 	ATF_REQUIRE_ERRNO(EFAULT, poll((struct pollfd *)-1, 1, -1) == -1);
    238 
    239 	errno = 0;
    240 	ATF_REQUIRE_ERRNO(EINVAL, poll(&pfd, 1, -2) == -1);
    241 }
    242 
    243 static const char	fifo_path[] = "pollhup_fifo";
    244 
    245 static void
    246 fifo_support(void)
    247 {
    248 
    249 	errno = 0;
    250 	if (mkfifo(fifo_path, 0600) == 0) {
    251 		RL(unlink(fifo_path));
    252 		return;
    253 	}
    254 
    255 	if (errno == EOPNOTSUPP) {
    256 		atf_tc_skip("the kernel does not support FIFOs");
    257 	} else {
    258 		atf_tc_fail("mkfifo(2) failed");
    259 	}
    260 }
    261 
    262 ATF_TC_WITH_CLEANUP(fifo_inout);
    263 ATF_TC_HEAD(fifo_inout, tc)
    264 {
    265 	atf_tc_set_md_var(tc, "descr",
    266 	    "Check POLLIN/POLLOUT behavior with fifos");
    267 }
    268 
    269 ATF_TC_BODY(fifo_inout, tc)
    270 {
    271 	struct pollfd pfd[2];
    272 	char *buf;
    273 	int rfd, wfd;
    274 	long pipe_buf;
    275 	int ret;
    276 	ssize_t nwrit, nread;
    277 
    278 	fifo_support();
    279 
    280 	RL(mkfifo(fifo_path, 0600));
    281 	RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
    282 	RL(wfd = open(fifo_path, O_WRONLY | O_NONBLOCK));
    283 
    284 	/* Get the maximum atomic pipe write size. */
    285 	pipe_buf = fpathconf(wfd, _PC_PIPE_BUF);
    286 	ATF_REQUIRE_MSG(pipe_buf > 1, "pipe_buf=%ld", pipe_buf);
    287 
    288 	REQUIRE_LIBC(buf = malloc(pipe_buf), NULL);
    289 
    290 	memset(&pfd, 0, sizeof(pfd));
    291 	pfd[0].fd = rfd;
    292 	pfd[0].events = POLLIN | POLLRDNORM;
    293 	pfd[1].fd = wfd;
    294 	pfd[1].events = POLLOUT | POLLWRNORM;
    295 
    296 	/* We expect the FIFO to be writable but not readable. */
    297 	RL(ret = poll(pfd, 2, 0));
    298 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    299 	ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
    300 	    "pfd[0].revents=0x%x", pfd[0].revents);
    301 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
    302 	    "pfd[1].revents=0x%x", pfd[1].revents);
    303 
    304 	/* Write a single byte of data into the FIFO. */
    305 	RL(nwrit = write(wfd, buf, 1));
    306 	ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
    307 
    308 	/* We expect the FIFO to be readable and writable. */
    309 	RL(ret = poll(pfd, 2, 0));
    310 	ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
    311 	ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
    312 	    "pfd[0].revents=0x%x", pfd[0].revents);
    313 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
    314 	    "pfd[1].revents=0x%x", pfd[1].revents);
    315 
    316 	/* Read that single byte back out. */
    317 	RL(nread = read(rfd, buf, 1));
    318 	ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
    319 
    320 	/*
    321 	 * Write data into the FIFO until it is full, which is
    322 	 * defined as insufficient buffer space to hold a the
    323 	 * maximum atomic pipe write size.
    324 	 */
    325 	while (write(wfd, buf, pipe_buf) != -1) {
    326 		continue;
    327 	}
    328 	ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
    329 
    330 	/* We expect the FIFO to be readble but not writable. */
    331 	RL(ret = poll(pfd, 2, 0));
    332 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    333 	ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
    334 	    "pfd[0].revents=0x%x", pfd[0].revents);
    335 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
    336 	    "pfd[1].revents=0x%x", pfd[1].revents);
    337 
    338 	/* Read a single byte of data from the FIFO. */
    339 	RL(nread = read(rfd, buf, 1));
    340 	ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
    341 
    342 	/*
    343 	 * Because we have read only a single byte out, there will
    344 	 * be insufficient space for a pipe_buf-sized message, so
    345 	 * the FIFO should still not be writable.
    346 	 */
    347 	RL(ret = poll(pfd, 2, 0));
    348 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    349 	ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
    350 	    "pfd[0].revents=0x%x", pfd[0].revents);
    351 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
    352 	    "pfd[1].revents=0x%x", pfd[1].revents);
    353 
    354 	/*
    355 	 * Now read enough so that exactly pipe_buf space should
    356 	 * be available.  The FIFO should be writable after that.
    357 	 * N.B. we don't care if it's readable at this point.
    358 	 */
    359 	RL(nread = read(rfd, buf, pipe_buf - 1));
    360 	ATF_REQUIRE_EQ_MSG(nread, pipe_buf - 1, "nread=%zd pipe_buf-1=%ld",
    361 	    nread, pipe_buf - 1);
    362 	RL(ret = poll(pfd, 2, 0));
    363 	ATF_REQUIRE_MSG(ret >= 1, "got: %d", ret);
    364 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
    365 	    "pfd[1].revents=0x%x", pfd[1].revents);
    366 
    367 	/*
    368 	 * Now read all of the data out of the FIFO and ensure that
    369 	 * we get back to the initial state.
    370 	 */
    371 	while (read(rfd, buf, pipe_buf) != -1) {
    372 		continue;
    373 	}
    374 	ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
    375 
    376 	RL(ret = poll(pfd, 2, 0));
    377 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    378 	ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
    379 	    "pfd[0].revents=0x%x", pfd[0].revents);
    380 	ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
    381 	    "pfd[1].revents=0x%x", pfd[1].revents);
    382 
    383 	RL(close(wfd));
    384 	RL(close(rfd));
    385 }
    386 
    387 ATF_TC_CLEANUP(fifo_inout, tc)
    388 {
    389 	(void)unlink(fifo_path);
    390 }
    391 
    392 ATF_TC_WITH_CLEANUP(fifo_hup1);
    393 ATF_TC_HEAD(fifo_hup1, tc)
    394 {
    395 	atf_tc_set_md_var(tc, "descr",
    396 	    "Check POLLHUP behavior with fifos [1]");
    397 }
    398 
    399 ATF_TC_BODY(fifo_hup1, tc)
    400 {
    401 	struct pollfd pfd;
    402 	int rfd, wfd;
    403 	int ret;
    404 
    405 	fifo_support();
    406 
    407 	RL(mkfifo(fifo_path, 0600));
    408 	RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
    409 	RL(wfd = open(fifo_path, O_WRONLY));
    410 
    411 	memset(&pfd, 0, sizeof(pfd));
    412 	pfd.fd = rfd;
    413 	pfd.events = POLLIN;
    414 
    415 	RL(close(wfd));
    416 
    417 	RL(ret = poll(&pfd, 1, 0));
    418 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    419 	ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
    420 	    "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
    421 	    pfd.revents, POLLHUP, POLLOUT);
    422 
    423 	/*
    424 	 * Check that POLLHUP is cleared when a writer re-connects.
    425 	 * Since the writer will not put any data into the FIFO, we
    426 	 * expect no events.
    427 	 */
    428 	memset(&pfd, 0, sizeof(pfd));
    429 	pfd.fd = rfd;
    430 	pfd.events = POLLIN;
    431 
    432 	RL(wfd = open(fifo_path, O_WRONLY));
    433 	RL(ret = poll(&pfd, 1, 0));
    434 	ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
    435 }
    436 
    437 ATF_TC_CLEANUP(fifo_hup1, tc)
    438 {
    439 	(void)unlink(fifo_path);
    440 }
    441 
    442 ATF_TC_WITH_CLEANUP(fifo_hup2);
    443 ATF_TC_HEAD(fifo_hup2, tc)
    444 {
    445 	atf_tc_set_md_var(tc, "descr",
    446 	    "Check POLLHUP behavior with fifos [2]");
    447 }
    448 
    449 ATF_TC_BODY(fifo_hup2, tc)
    450 {
    451 	struct pollfd pfd;
    452 	int rfd, wfd;
    453 	pid_t pid;
    454 	struct timespec ts1, ts2;
    455 	int ret;
    456 
    457 	fifo_support();
    458 
    459 	RL(mkfifo(fifo_path, 0600));
    460 	RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
    461 	RL(wfd = open(fifo_path, O_WRONLY));
    462 
    463 	memset(&pfd, 0, sizeof(pfd));
    464 	pfd.fd = rfd;
    465 	pfd.events = POLLIN;
    466 
    467 	RL(pid = fork());
    468 	if (pid == 0) {
    469 		if (close(rfd))
    470 			_exit(1);
    471 		sleep(5);
    472 		if (close(wfd))
    473 			_exit(1);
    474 		_exit(0);
    475 	}
    476 	RL(close(wfd));
    477 
    478 	RL(clock_gettime(CLOCK_MONOTONIC, &ts1));
    479 	RL(ret = poll(&pfd, 1, INFTIM));
    480 	ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
    481 	RL(clock_gettime(CLOCK_MONOTONIC, &ts2));
    482 
    483 	/* Make sure at least a couple of seconds have elapsed. */
    484 	ATF_REQUIRE_MSG(ts2.tv_sec - ts1.tv_sec >= 2,
    485 	    "ts1=%lld.%09ld ts2=%lld.%09ld",
    486 	    (long long)ts1.tv_sec, ts1.tv_nsec,
    487 	    (long long)ts2.tv_sec, ts2.tv_nsec);
    488 
    489 	ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
    490 	    "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
    491 	    pfd.revents, POLLHUP, POLLOUT);
    492 }
    493 
    494 ATF_TC_CLEANUP(fifo_hup2, tc)
    495 {
    496 	(void)unlink(fifo_path);
    497 }
    498 
    499 static void
    500 fillpipebuf(int writefd)
    501 {
    502 	char buf[BUFSIZ] = {0};
    503 	size_t n = 0;
    504 	ssize_t nwrit;
    505 	int flags;
    506 
    507 	RL(flags = fcntl(writefd, F_GETFL));
    508 	RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
    509 	while ((nwrit = write(writefd, buf, sizeof(buf))) != -1)
    510 		n += (size_t)nwrit;
    511 	ATF_CHECK_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
    512 	RL(fcntl(writefd, F_SETFL, flags));
    513 	fprintf(stderr, "filled %d with %zu bytes\n", writefd, n);
    514 }
    515 
    516 static void
    517 check_write_epipe(int writefd)
    518 {
    519 	int flags;
    520 	void (*sighandler)(int);
    521 	char c = 0;
    522 	ssize_t nwrit;
    523 
    524 	RL(flags = fcntl(writefd, F_GETFL));
    525 	RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
    526 
    527 	REQUIRE_LIBC(sighandler = signal(SIGPIPE, SIG_IGN), SIG_ERR);
    528 	ATF_CHECK_ERRNO(EPIPE, (nwrit = write(writefd, &c, 1)) == -1);
    529 	ATF_CHECK_EQ_MSG(nwrit, -1, "nwrit=%zd", nwrit);
    530 	REQUIRE_LIBC(signal(SIGPIPE, sighandler), SIG_ERR);
    531 
    532 	RL(fcntl(writefd, F_SETFL, flags));
    533 }
    534 
    535 static void
    536 check_read_eof(int readfd)
    537 {
    538 	int flags;
    539 	char c;
    540 	ssize_t nread;
    541 
    542 	RL(flags = fcntl(readfd, F_GETFL));
    543 	RL(fcntl(readfd, F_SETFL, flags|O_NONBLOCK));
    544 
    545 	RL(nread = read(readfd, &c, 1));
    546 	ATF_CHECK_EQ_MSG(nread, 0, "nread=%zu", nread);
    547 
    548 	RL(fcntl(readfd, F_SETFL, flags));
    549 }
    550 
    551 static void
    552 check_pollclosed_delayed_write(int writefd, int readfd)
    553 {
    554 	struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
    555 	struct timespec start, end, delta;
    556 	int nfds;
    557 
    558 	/*
    559 	 * Don't let poll sleep for more than 3sec.  (The close delay
    560 	 * will be 2sec, and we make sure that we sleep at least 1sec.)
    561 	 */
    562 	REQUIRE_LIBC(alarm(3), (unsigned)-1);
    563 
    564 	/*
    565 	 * Wait in poll(2) indefinitely (subject to the alarm) and
    566 	 * measure how long we slept.
    567 	 */
    568 	fprintf(stderr, "poll %d\n", writefd);
    569 	RL(clock_gettime(CLOCK_MONOTONIC, &start));
    570 	RL(nfds = poll(&pfd, 1, INFTIM));
    571 	RL(clock_gettime(CLOCK_MONOTONIC, &end));
    572 	fprintf(stderr, "poll %d done nfds=%d\n", writefd, nfds);
    573 
    574 	REQUIRE_LIBC(alarm(0), (unsigned)-1);
    575 
    576 	/*
    577 	 * The reader has been closed, so write will fail immediately
    578 	 * with EPIPE/SIGPIPE, and thus POLLOUT must be set.  POLLHUP
    579 	 * is only returned for reads, not for writes (and is mutually
    580 	 * exclusive with POLLOUT).
    581 	 */
    582 	RL(nfds = poll(&pfd, 1, 0));
    583 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    584 	ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
    585 	    pfd.fd, writefd);
    586 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), POLLOUT,
    587 	    "revents=0x%x expected POLLOUT=0x%x"
    588 	    " but not POLLHUP=0x%x or POLLIN=0x%x",
    589 	    pfd.revents, POLLOUT, POLLHUP, POLLIN);
    590 
    591 	/*
    592 	 * We should have slept at least 1sec.
    593 	 */
    594 	timespecsub(&end, &start, &delta);
    595 	ATF_CHECK_MSG(delta.tv_sec >= 1,
    596 	    "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
    597 
    598 	/*
    599 	 * Write should fail with EPIPE/SIGPIPE now -- and continue to
    600 	 * do so.
    601 	 */
    602 	check_write_epipe(writefd);
    603 	check_write_epipe(writefd);
    604 }
    605 
    606 static void
    607 check_pollclosed_delayed_read(int readfd, int writefd, int pollhup)
    608 {
    609 	struct pollfd pfd;
    610 	struct timespec start, end, delta;
    611 	int nfds;
    612 
    613 	/*
    614 	 * Don't let poll sleep for more than 3sec.  (The close delay
    615 	 * will be 2sec, and we make sure that we sleep at least 1sec.)
    616 	 */
    617 	REQUIRE_LIBC(alarm(3), (unsigned)-1);
    618 
    619 	/*
    620 	 * Wait in poll(2) indefinitely (subject to the alarm) and
    621 	 * measure how long we slept.
    622 	 */
    623 	pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
    624 	fprintf(stderr, "poll %d\n", readfd);
    625 	RL(clock_gettime(CLOCK_MONOTONIC, &start));
    626 	RL(nfds = poll(&pfd, 1, INFTIM));
    627 	RL(clock_gettime(CLOCK_MONOTONIC, &end));
    628 	fprintf(stderr, "poll %d done nfds=%d\n", readfd, nfds);
    629 
    630 	REQUIRE_LIBC(alarm(0), (unsigned)-1);
    631 
    632 	/*
    633 	 * Read will yield EOF without blocking, so POLLIN should be
    634 	 * set, and the write side has been closed, so POLLHUP should
    635 	 * also be set, unsolicited, if this is a pipe or FIFO -- but
    636 	 * not if it's a socket, where POLLHUP is never set.  Since we
    637 	 * didn't ask for POLLOUT, it should be clear.
    638 	 */
    639 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    640 	ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
    641 	    pfd.fd, readfd, writefd);
    642 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    643 	    pollhup|POLLIN,
    644 	    "revents=0x%x expected=0x%x"
    645 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    646 	    pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
    647 
    648 	/*
    649 	 * We should have slept at least 1sec.
    650 	 */
    651 	timespecsub(&end, &start, &delta);
    652 	ATF_CHECK_MSG(delta.tv_sec >= 1,
    653 	    "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
    654 
    655 	/*
    656 	 * Read should return EOF now -- and continue to do so.
    657 	 */
    658 	check_read_eof(readfd);
    659 	check_read_eof(readfd);
    660 
    661 	/*
    662 	 * POLLHUP|POLLIN state should be persistent (until the writer
    663 	 * side is reopened if possible, as in a named pipe).
    664 	 */
    665 	pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
    666 	RL(nfds = poll(&pfd, 1, 0));
    667 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    668 	ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
    669 	    pfd.fd, readfd, writefd);
    670 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    671 	    pollhup|POLLIN,
    672 	    "revents=0x%x expected=0x%x"
    673 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    674 	    pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
    675 }
    676 
    677 static void
    678 check_pollclosed_delayed_read_pipefifo(int readfd, int writefd)
    679 {
    680 
    681 	check_pollclosed_delayed_read(readfd, writefd, POLLHUP);
    682 }
    683 
    684 static void
    685 check_pollclosed_delayed_read_socket(int readfd, int writefd)
    686 {
    687 
    688 	check_pollclosed_delayed_read(readfd, writefd, /*no POLLHUP*/0);
    689 }
    690 
    691 static void
    692 check_pollclosed_delayed_process(int pollfd, int closefd,
    693     void (*check_pollhup)(int, int))
    694 {
    695 	pid_t pid;
    696 	int status;
    697 
    698 	/*
    699 	 * Fork a child to close closefd after a 2sec delay.
    700 	 */
    701 	RL(pid = fork());
    702 	if (pid == 0) {
    703 		sleep(2);
    704 		fprintf(stderr, "[child] close %d\n", closefd);
    705 		if (close(closefd) == -1)
    706 			_exit(1);
    707 		_exit(0);
    708 	}
    709 
    710 	/*
    711 	 * Close closefd in the parent so the child has the last
    712 	 * reference to it.
    713 	 */
    714 	fprintf(stderr, "[parent] close %d\n", closefd);
    715 	RL(close(closefd));
    716 
    717 	/*
    718 	 * Test poll(2).
    719 	 */
    720 	(*check_pollhup)(pollfd, closefd);
    721 
    722 	/*
    723 	 * Wait for the child and make sure it exited successfully.
    724 	 */
    725 	RL(waitpid(pid, &status, 0));
    726 	ATF_CHECK_EQ_MSG(status, 0, "child exited with status 0x%x", status);
    727 }
    728 
    729 static void *
    730 check_pollclosed_thread(void *cookie)
    731 {
    732 	int *closefdp = cookie;
    733 
    734 	sleep(2);
    735 	fprintf(stderr, "[thread] close %d\n", *closefdp);
    736 	RL(close(*closefdp));
    737 	return NULL;
    738 }
    739 
    740 static void
    741 check_pollclosed_delayed_thread(int pollfd, int closefd,
    742     void (*check_pollhup)(int, int))
    743 {
    744 	pthread_t t;
    745 
    746 	/*
    747 	 * Create a thread to close closefd (in this process, not a
    748 	 * child) after a 2sec delay.
    749 	 */
    750 	RZ(pthread_create(&t, NULL, &check_pollclosed_thread, &closefd));
    751 
    752 	/*
    753 	 * Test poll(2).
    754 	 */
    755 	(*check_pollhup)(pollfd, closefd);
    756 
    757 	/*
    758 	 * Wait for the thread to complete.
    759 	 */
    760 	RZ(pthread_join(t, NULL));
    761 }
    762 
    763 static void
    764 check_pollclosed_immediate_write(int writefd, int readfd)
    765 {
    766 	struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
    767 	int nfds;
    768 
    769 	/*
    770 	 * Close the reader side immediately.
    771 	 */
    772 	fprintf(stderr, "[immediate] close %d\n", readfd);
    773 	RL(close(readfd));
    774 
    775 	/*
    776 	 * The reader has been closed, so write will fail immediately
    777 	 * with EPIPE/SIGPIPE, and thus POLLOUT must be set.  POLLHUP
    778 	 * is only returned for reads, not for writes (and is mutually
    779 	 * exclusive with POLLOUT).
    780 	 */
    781 	RL(nfds = poll(&pfd, 1, 0));
    782 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    783 	ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
    784 	    pfd.fd, writefd);
    785 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), POLLOUT,
    786 	    "revents=0x%x expected POLLOUT=0x%x"
    787 	    " but not POLLHUP=0x%x or POLLIN=0x%x",
    788 	    pfd.revents, POLLOUT, POLLHUP, POLLIN);
    789 
    790 	/*
    791 	 * Write should fail with EPIPE/SIGPIPE now -- and continue to
    792 	 * do so.
    793 	 */
    794 	check_write_epipe(writefd);
    795 	check_write_epipe(writefd);
    796 }
    797 
    798 static void
    799 check_pollclosed_immediate_readnone(int readfd, int writefd, int pollhup)
    800 {
    801 	struct pollfd pfd = { .fd = readfd, .events = POLLIN };
    802 	int nfds;
    803 
    804 	/*
    805 	 * Close the writer side immediately.
    806 	 */
    807 	fprintf(stderr, "[immediate] close %d\n", writefd);
    808 	RL(close(writefd));
    809 
    810 	/*
    811 	 * Read will yield EOF without blocking, so POLLIN should be
    812 	 * set, and the write side has been closed, so POLLHUP should
    813 	 * be set, unsolicited, if this is a pipe or FIFO -- but not if
    814 	 * it's a socket, where POLLHUP is never set.  Since we didn't
    815 	 * ask for POLLOUT, it should be clear.
    816 	 */
    817 	RL(nfds = poll(&pfd, 1, 0));
    818 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    819 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    820 	    pollhup|POLLIN,
    821 	    "revents=0x%x expected=0x%x"
    822 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    823 	    pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
    824 
    825 	/*
    826 	 * Read should return EOF now -- and continue to do so.
    827 	 */
    828 	check_read_eof(readfd);
    829 	check_read_eof(readfd);
    830 }
    831 
    832 static void
    833 check_pollclosed_immediate_readsome(int readfd, int writefd, int pollhup)
    834 {
    835 	struct pollfd pfd;
    836 	char buf[BUFSIZ];
    837 	ssize_t nread;
    838 	int nfds;
    839 
    840 	/*
    841 	 * Close the writer side immediately.
    842 	 */
    843 	fprintf(stderr, "[immediate] close %d\n", writefd);
    844 	RL(close(writefd));
    845 
    846 	/*
    847 	 * Some data should be ready to read, so POLLIN should be set,
    848 	 * and the write side has been closed, so POLLHUP should also
    849 	 * be set, unsolicited, if this is a pipe or FIFO -- but not if
    850 	 * it's a socket, where POLLHUP is never set.  Since we didn't
    851 	 * ask for POLLOUT, it should be clear.
    852 	 */
    853 	pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
    854 	RL(nfds = poll(&pfd, 1, 0));
    855 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    856 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    857 	    POLLIN|pollhup,
    858 	    "revents=0x%x expected=0x%x"
    859 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    860 	    pfd.revents, POLLIN|pollhup, POLLHUP, POLLIN, POLLOUT);
    861 
    862 	/*
    863 	 * Read all the data.  Each read should complete instantly --
    864 	 * no blocking, either because there's data to read or because
    865 	 * the writer has hung up and we get EOF.
    866 	 */
    867 	do {
    868 		REQUIRE_LIBC(alarm(1), (unsigned)-1);
    869 		RL(nread = read(readfd, buf, sizeof(buf)));
    870 		REQUIRE_LIBC(alarm(0), (unsigned)-1);
    871 	} while (nread != 0);
    872 
    873 	/*
    874 	 * Read will yield EOF without blocking, so POLLIN should be
    875 	 * set, and the write side has been closed, so POLLHUP should
    876 	 * also be set, unsolicited, if this is a pipe or FIFO -- but
    877 	 * not if it's a socket, where POLLHUP is never set.  Since we
    878 	 * didn't ask for POLLOUT, it should be clear.
    879 	 */
    880 	pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
    881 	RL(nfds = poll(&pfd, 1, 0));
    882 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    883 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    884 	    pollhup|POLLIN,
    885 	    "revents=0x%x expected=0x%x"
    886 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    887 	    pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
    888 
    889 	/*
    890 	 * Read should return EOF now -- and continue to do so.
    891 	 */
    892 	check_read_eof(readfd);
    893 	check_read_eof(readfd);
    894 
    895 	/*
    896 	 * POLLHUP|POLLIN state should be persistent (until the writer
    897 	 * side is reopened if possible, as in a named pipe).
    898 	 */
    899 	pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
    900 	RL(nfds = poll(&pfd, 1, 0));
    901 	ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
    902 	ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
    903 	    pollhup|POLLIN,
    904 	    "revents=0x%x expected=0x%x"
    905 	    " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
    906 	    pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
    907 }
    908 
    909 static void *
    910 pollclosed_fifo_writer_thread(void *cookie)
    911 {
    912 	int *pp = cookie;
    913 
    914 	RL(*pp = open(fifo_path, O_WRONLY));
    915 	return NULL;
    916 }
    917 
    918 static void *
    919 pollclosed_fifo_reader_thread(void *cookie)
    920 {
    921 	int *pp = cookie;
    922 
    923 	RL(*pp = open(fifo_path, O_RDONLY));
    924 	return NULL;
    925 }
    926 
    927 static void
    928 pollclosed_fifo0_setup(int *writefdp, int *readfdp)
    929 {
    930 	int p0, p1;
    931 	pthread_t t;
    932 
    933 	fifo_support();
    934 
    935 	RL(mkfifo(fifo_path, 0600));
    936 	RZ(pthread_create(&t, NULL, &pollclosed_fifo_reader_thread, &p0));
    937 	REQUIRE_LIBC(alarm(1), (unsigned)-1);
    938 	RL(p1 = open(fifo_path, O_WRONLY));
    939 	REQUIRE_LIBC(alarm(0), (unsigned)-1);
    940 	RZ(pthread_join(t, NULL));
    941 
    942 	*writefdp = p1;
    943 	*readfdp = p0;
    944 }
    945 
    946 static void
    947 pollclosed_fifo1_setup(int *writefdp, int *readfdp)
    948 {
    949 	int p0, p1;
    950 	pthread_t t;
    951 
    952 	fifo_support();
    953 
    954 	RL(mkfifo(fifo_path, 0600));
    955 	RZ(pthread_create(&t, NULL, &pollclosed_fifo_writer_thread, &p0));
    956 	REQUIRE_LIBC(alarm(1), (unsigned)-1);
    957 	RL(p1 = open(fifo_path, O_RDONLY));
    958 	REQUIRE_LIBC(alarm(0), (unsigned)-1);
    959 	RZ(pthread_join(t, NULL));
    960 
    961 	*writefdp = p0;
    962 	*readfdp = p1;
    963 }
    964 
    965 static void
    966 pollclosed_pipe_setup(int *writefdp, int *readfdp)
    967 {
    968 	int p[2];
    969 
    970 	RL(pipe(p));
    971 
    972 	*readfdp = p[0];	/* reader side */
    973 	*writefdp = p[1];	/* writer side */
    974 }
    975 
    976 static void
    977 pollclosed_socketpair0_setup(int *writefdp, int *readfdp)
    978 {
    979 	int s[2];
    980 
    981 	RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
    982 	*readfdp = s[0];
    983 	*writefdp = s[1];
    984 }
    985 
    986 static void
    987 pollclosed_socketpair1_setup(int *writefdp, int *readfdp)
    988 {
    989 	int s[2];
    990 
    991 	RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
    992 	*readfdp = s[1];
    993 	*writefdp = s[0];
    994 }
    995 
    996 /*
    997  * Cartesian product of:
    998  *
    999  * 1. [fifo0] first fifo opener
   1000  * 2. [fifo1] second fifo opener
   1001  * 3. [pipe] pipe
   1002  * 4. [socketpair0] first side of socket pair
   1003  * 5. [socketpair1] second side of socket pair
   1004  *
   1005  * with
   1006  *
   1007  * 1. [immediate] closed before poll starts
   1008  * 2. [delayed_thread] closed by another thread after poll starts
   1009  * 3. [delayed_process] closed by another process after poll starts
   1010  *
   1011  * with
   1012  *
   1013  * 1. [writefull] close reader, poll for write when buffer full
   1014  * 2. [writeempty] close reader, poll for write when buffer empty
   1015  * 3. [readnone] close writer, poll for read when nothing to read
   1016  * 4. [readsome] close writer, poll for read when something to read
   1017  *
   1018  * except that in the delayed cases we only do writefull [write] and
   1019  * readnone [read], because there's no delay in the writeempty/readsome
   1020  * cases.
   1021  */
   1022 
   1023 ATF_TC(pollclosed_fifo0_immediate_writefull);
   1024 ATF_TC_HEAD(pollclosed_fifo0_immediate_writefull, tc)
   1025 {
   1026 	atf_tc_set_md_var(tc, "descr",
   1027 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1028 }
   1029 ATF_TC_BODY(pollclosed_fifo0_immediate_writefull, tc)
   1030 {
   1031 	int writefd, readfd;
   1032 
   1033 	pollclosed_fifo0_setup(&writefd, &readfd);
   1034 	fillpipebuf(writefd);
   1035 	check_pollclosed_immediate_write(writefd, readfd);
   1036 }
   1037 
   1038 ATF_TC(pollclosed_fifo0_immediate_writeempty);
   1039 ATF_TC_HEAD(pollclosed_fifo0_immediate_writeempty, tc)
   1040 {
   1041 	atf_tc_set_md_var(tc, "descr",
   1042 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1043 }
   1044 ATF_TC_BODY(pollclosed_fifo0_immediate_writeempty, tc)
   1045 {
   1046 	int writefd, readfd;
   1047 
   1048 	pollclosed_fifo0_setup(&writefd, &readfd);
   1049 	/* don't fill the pipe buf */
   1050 	check_pollclosed_immediate_write(writefd, readfd);
   1051 }
   1052 
   1053 ATF_TC(pollclosed_fifo0_immediate_readsome);
   1054 ATF_TC_HEAD(pollclosed_fifo0_immediate_readsome, tc)
   1055 {
   1056 	atf_tc_set_md_var(tc, "descr",
   1057 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1058 }
   1059 ATF_TC_BODY(pollclosed_fifo0_immediate_readsome, tc)
   1060 {
   1061 	int writefd, readfd;
   1062 
   1063 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1064 
   1065 	pollclosed_fifo1_setup(&writefd, &readfd);
   1066 	fillpipebuf(writefd);
   1067 	check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
   1068 }
   1069 
   1070 ATF_TC(pollclosed_fifo0_immediate_readnone);
   1071 ATF_TC_HEAD(pollclosed_fifo0_immediate_readnone, tc)
   1072 {
   1073 	atf_tc_set_md_var(tc, "descr",
   1074 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1075 }
   1076 ATF_TC_BODY(pollclosed_fifo0_immediate_readnone, tc)
   1077 {
   1078 	int writefd, readfd;
   1079 
   1080 	pollclosed_fifo1_setup(&writefd, &readfd);
   1081 	/* don't fill the pipe buf */
   1082 	check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
   1083 }
   1084 
   1085 ATF_TC(pollclosed_fifo0_delayed_process_write);
   1086 ATF_TC_HEAD(pollclosed_fifo0_delayed_process_write, tc)
   1087 {
   1088 	atf_tc_set_md_var(tc, "descr",
   1089 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1090 }
   1091 ATF_TC_BODY(pollclosed_fifo0_delayed_process_write, tc)
   1092 {
   1093 	int writefd, readfd;
   1094 
   1095 	pollclosed_fifo0_setup(&writefd, &readfd);
   1096 	fillpipebuf(writefd);
   1097 	check_pollclosed_delayed_process(writefd, readfd,
   1098 	    &check_pollclosed_delayed_write);
   1099 }
   1100 
   1101 ATF_TC(pollclosed_fifo0_delayed_process_read);
   1102 ATF_TC_HEAD(pollclosed_fifo0_delayed_process_read, tc)
   1103 {
   1104 	atf_tc_set_md_var(tc, "descr",
   1105 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1106 }
   1107 ATF_TC_BODY(pollclosed_fifo0_delayed_process_read, tc)
   1108 {
   1109 	int writefd, readfd;
   1110 
   1111 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1112 
   1113 	pollclosed_fifo1_setup(&writefd, &readfd);
   1114 	/* don't fill pipe buf */
   1115 	check_pollclosed_delayed_process(readfd, writefd,
   1116 	    &check_pollclosed_delayed_read_pipefifo);
   1117 }
   1118 
   1119 ATF_TC(pollclosed_fifo0_delayed_thread_write);
   1120 ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_write, tc)
   1121 {
   1122 	atf_tc_set_md_var(tc, "descr",
   1123 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1124 }
   1125 ATF_TC_BODY(pollclosed_fifo0_delayed_thread_write, tc)
   1126 {
   1127 	int writefd, readfd;
   1128 
   1129 	pollclosed_fifo0_setup(&writefd, &readfd);
   1130 	fillpipebuf(writefd);
   1131 	check_pollclosed_delayed_thread(writefd, readfd,
   1132 	    &check_pollclosed_delayed_write);
   1133 }
   1134 
   1135 ATF_TC(pollclosed_fifo0_delayed_thread_read);
   1136 ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_read, tc)
   1137 {
   1138 	atf_tc_set_md_var(tc, "descr",
   1139 	    "Checks POLLHUP with closing the first opener of a named pipe");
   1140 }
   1141 ATF_TC_BODY(pollclosed_fifo0_delayed_thread_read, tc)
   1142 {
   1143 	int writefd, readfd;
   1144 
   1145 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1146 
   1147 	pollclosed_fifo1_setup(&writefd, &readfd);
   1148 	/* don't fill pipe buf */
   1149 	check_pollclosed_delayed_thread(readfd, writefd,
   1150 	    &check_pollclosed_delayed_read_pipefifo);
   1151 }
   1152 
   1153 ATF_TC(pollclosed_fifo1_immediate_writefull);
   1154 ATF_TC_HEAD(pollclosed_fifo1_immediate_writefull, tc)
   1155 {
   1156 	atf_tc_set_md_var(tc, "descr",
   1157 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1158 }
   1159 ATF_TC_BODY(pollclosed_fifo1_immediate_writefull, tc)
   1160 {
   1161 	int writefd, readfd;
   1162 
   1163 	pollclosed_fifo1_setup(&writefd, &readfd);
   1164 	fillpipebuf(writefd);
   1165 	check_pollclosed_immediate_write(writefd, readfd);
   1166 }
   1167 
   1168 ATF_TC(pollclosed_fifo1_immediate_writeempty);
   1169 ATF_TC_HEAD(pollclosed_fifo1_immediate_writeempty, tc)
   1170 {
   1171 	atf_tc_set_md_var(tc, "descr",
   1172 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1173 }
   1174 ATF_TC_BODY(pollclosed_fifo1_immediate_writeempty, tc)
   1175 {
   1176 	int writefd, readfd;
   1177 
   1178 	pollclosed_fifo1_setup(&writefd, &readfd);
   1179 	/* don't fill the pipe buf */
   1180 	check_pollclosed_immediate_write(writefd, readfd);
   1181 }
   1182 
   1183 ATF_TC(pollclosed_fifo1_immediate_readsome);
   1184 ATF_TC_HEAD(pollclosed_fifo1_immediate_readsome, tc)
   1185 {
   1186 	atf_tc_set_md_var(tc, "descr",
   1187 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1188 }
   1189 ATF_TC_BODY(pollclosed_fifo1_immediate_readsome, tc)
   1190 {
   1191 	int writefd, readfd;
   1192 
   1193 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1194 
   1195 	pollclosed_fifo1_setup(&writefd, &readfd);
   1196 	fillpipebuf(writefd);
   1197 	check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
   1198 }
   1199 
   1200 ATF_TC(pollclosed_fifo1_immediate_readnone);
   1201 ATF_TC_HEAD(pollclosed_fifo1_immediate_readnone, tc)
   1202 {
   1203 	atf_tc_set_md_var(tc, "descr",
   1204 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1205 }
   1206 ATF_TC_BODY(pollclosed_fifo1_immediate_readnone, tc)
   1207 {
   1208 	int writefd, readfd;
   1209 
   1210 	pollclosed_fifo1_setup(&writefd, &readfd);
   1211 	/* don't fill the pipe buf */
   1212 	check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
   1213 }
   1214 
   1215 ATF_TC(pollclosed_fifo1_delayed_process_write);
   1216 ATF_TC_HEAD(pollclosed_fifo1_delayed_process_write, tc)
   1217 {
   1218 	atf_tc_set_md_var(tc, "descr",
   1219 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1220 }
   1221 ATF_TC_BODY(pollclosed_fifo1_delayed_process_write, tc)
   1222 {
   1223 	int writefd, readfd;
   1224 
   1225 	pollclosed_fifo1_setup(&writefd, &readfd);
   1226 	fillpipebuf(writefd);
   1227 	check_pollclosed_delayed_process(writefd, readfd,
   1228 	    &check_pollclosed_delayed_write);
   1229 }
   1230 
   1231 ATF_TC(pollclosed_fifo1_delayed_process_read);
   1232 ATF_TC_HEAD(pollclosed_fifo1_delayed_process_read, tc)
   1233 {
   1234 	atf_tc_set_md_var(tc, "descr",
   1235 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1236 }
   1237 ATF_TC_BODY(pollclosed_fifo1_delayed_process_read, tc)
   1238 {
   1239 	int writefd, readfd;
   1240 
   1241 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1242 
   1243 	pollclosed_fifo0_setup(&writefd, &readfd);
   1244 	/* don't fill pipe buf */
   1245 	check_pollclosed_delayed_process(readfd, writefd,
   1246 	    &check_pollclosed_delayed_read_pipefifo);
   1247 }
   1248 
   1249 ATF_TC(pollclosed_fifo1_delayed_thread_write);
   1250 ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_write, tc)
   1251 {
   1252 	atf_tc_set_md_var(tc, "descr",
   1253 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1254 }
   1255 ATF_TC_BODY(pollclosed_fifo1_delayed_thread_write, tc)
   1256 {
   1257 	int writefd, readfd;
   1258 
   1259 	pollclosed_fifo1_setup(&writefd, &readfd);
   1260 	fillpipebuf(writefd);
   1261 	check_pollclosed_delayed_thread(writefd, readfd,
   1262 	    &check_pollclosed_delayed_write);
   1263 }
   1264 
   1265 ATF_TC(pollclosed_fifo1_delayed_thread_read);
   1266 ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_read, tc)
   1267 {
   1268 	atf_tc_set_md_var(tc, "descr",
   1269 	    "Checks POLLHUP with closing the second opener of a named pipe");
   1270 }
   1271 ATF_TC_BODY(pollclosed_fifo1_delayed_thread_read, tc)
   1272 {
   1273 	int writefd, readfd;
   1274 
   1275 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1276 
   1277 	pollclosed_fifo0_setup(&writefd, &readfd);
   1278 	/* don't fill pipe buf */
   1279 	check_pollclosed_delayed_process(readfd, writefd,
   1280 	    &check_pollclosed_delayed_read_pipefifo);
   1281 }
   1282 
   1283 ATF_TC(pollclosed_pipe_immediate_writefull);
   1284 ATF_TC_HEAD(pollclosed_pipe_immediate_writefull, tc)
   1285 {
   1286 	atf_tc_set_md_var(tc, "descr",
   1287 	    "Checks POLLHUP with a closed pipe");
   1288 }
   1289 ATF_TC_BODY(pollclosed_pipe_immediate_writefull, tc)
   1290 {
   1291 	int writefd, readfd;
   1292 
   1293 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1294 
   1295 	pollclosed_pipe_setup(&writefd, &readfd);
   1296 	fillpipebuf(writefd);
   1297 	check_pollclosed_immediate_write(writefd, readfd);
   1298 }
   1299 
   1300 ATF_TC(pollclosed_pipe_immediate_writeempty);
   1301 ATF_TC_HEAD(pollclosed_pipe_immediate_writeempty, tc)
   1302 {
   1303 	atf_tc_set_md_var(tc, "descr",
   1304 	    "Checks POLLHUP with a closed pipe");
   1305 }
   1306 ATF_TC_BODY(pollclosed_pipe_immediate_writeempty, tc)
   1307 {
   1308 	int writefd, readfd;
   1309 
   1310 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1311 
   1312 	pollclosed_pipe_setup(&writefd, &readfd);
   1313 	/* don't fill pipe buf */
   1314 	check_pollclosed_immediate_write(writefd, readfd);
   1315 }
   1316 
   1317 ATF_TC(pollclosed_pipe_immediate_readsome);
   1318 ATF_TC_HEAD(pollclosed_pipe_immediate_readsome, tc)
   1319 {
   1320 	atf_tc_set_md_var(tc, "descr",
   1321 	    "Checks POLLHUP with a closed pipe");
   1322 }
   1323 ATF_TC_BODY(pollclosed_pipe_immediate_readsome, tc)
   1324 {
   1325 	int writefd, readfd;
   1326 
   1327 	pollclosed_pipe_setup(&writefd, &readfd);
   1328 	fillpipebuf(writefd);
   1329 	check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
   1330 }
   1331 
   1332 ATF_TC(pollclosed_pipe_immediate_readnone);
   1333 ATF_TC_HEAD(pollclosed_pipe_immediate_readnone, tc)
   1334 {
   1335 	atf_tc_set_md_var(tc, "descr",
   1336 	    "Checks POLLHUP with a closed pipe");
   1337 }
   1338 ATF_TC_BODY(pollclosed_pipe_immediate_readnone, tc)
   1339 {
   1340 	int writefd, readfd;
   1341 
   1342 	pollclosed_pipe_setup(&writefd, &readfd);
   1343 	/* don't fill pipe buf */
   1344 	check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
   1345 }
   1346 
   1347 ATF_TC(pollclosed_pipe_delayed_process_write);
   1348 ATF_TC_HEAD(pollclosed_pipe_delayed_process_write, tc)
   1349 {
   1350 	atf_tc_set_md_var(tc, "descr",
   1351 	    "Checks POLLHUP with a closed pipe");
   1352 }
   1353 ATF_TC_BODY(pollclosed_pipe_delayed_process_write, tc)
   1354 {
   1355 	int writefd, readfd;
   1356 
   1357 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1358 
   1359 	pollclosed_pipe_setup(&writefd, &readfd);
   1360 	fillpipebuf(writefd);
   1361 	check_pollclosed_delayed_process(writefd, readfd,
   1362 	    &check_pollclosed_delayed_write);
   1363 }
   1364 
   1365 ATF_TC(pollclosed_pipe_delayed_process_read);
   1366 ATF_TC_HEAD(pollclosed_pipe_delayed_process_read, tc)
   1367 {
   1368 	atf_tc_set_md_var(tc, "descr",
   1369 	    "Checks POLLHUP with a closed pipe");
   1370 }
   1371 ATF_TC_BODY(pollclosed_pipe_delayed_process_read, tc)
   1372 {
   1373 	int writefd, readfd;
   1374 
   1375 	pollclosed_pipe_setup(&writefd, &readfd);
   1376 	/* don't fill pipe buf */
   1377 	check_pollclosed_delayed_process(readfd, writefd,
   1378 	    &check_pollclosed_delayed_read_pipefifo);
   1379 }
   1380 
   1381 ATF_TC(pollclosed_pipe_delayed_thread_write);
   1382 ATF_TC_HEAD(pollclosed_pipe_delayed_thread_write, tc)
   1383 {
   1384 	atf_tc_set_md_var(tc, "descr",
   1385 	    "Checks POLLHUP with a closed pipe");
   1386 }
   1387 ATF_TC_BODY(pollclosed_pipe_delayed_thread_write, tc)
   1388 {
   1389 	int writefd, readfd;
   1390 
   1391 	atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
   1392 
   1393 	pollclosed_pipe_setup(&writefd, &readfd);
   1394 	fillpipebuf(writefd);
   1395 	check_pollclosed_delayed_thread(writefd, readfd,
   1396 	    &check_pollclosed_delayed_write);
   1397 }
   1398 
   1399 ATF_TC(pollclosed_pipe_delayed_thread_read);
   1400 ATF_TC_HEAD(pollclosed_pipe_delayed_thread_read, tc)
   1401 {
   1402 	atf_tc_set_md_var(tc, "descr",
   1403 	    "Checks POLLHUP with a closed pipe");
   1404 }
   1405 ATF_TC_BODY(pollclosed_pipe_delayed_thread_read, tc)
   1406 {
   1407 	int writefd, readfd;
   1408 
   1409 	pollclosed_pipe_setup(&writefd, &readfd);
   1410 	/* don't fill pipe buf */
   1411 	check_pollclosed_delayed_thread(readfd, writefd,
   1412 	    &check_pollclosed_delayed_read_pipefifo);
   1413 }
   1414 
   1415 ATF_TC(pollclosed_socketpair0_immediate_writefull);
   1416 ATF_TC_HEAD(pollclosed_socketpair0_immediate_writefull, tc)
   1417 {
   1418 	atf_tc_set_md_var(tc, "descr",
   1419 	    "Checks POLLHUP with closing the first half of a socketpair");
   1420 }
   1421 ATF_TC_BODY(pollclosed_socketpair0_immediate_writefull, tc)
   1422 {
   1423 	int writefd, readfd;
   1424 
   1425 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1426 	fillpipebuf(writefd);
   1427 	check_pollclosed_immediate_write(writefd, readfd);
   1428 }
   1429 
   1430 ATF_TC(pollclosed_socketpair0_immediate_writeempty);
   1431 ATF_TC_HEAD(pollclosed_socketpair0_immediate_writeempty, tc)
   1432 {
   1433 	atf_tc_set_md_var(tc, "descr",
   1434 	    "Checks POLLHUP with closing the first half of a socketpair");
   1435 }
   1436 ATF_TC_BODY(pollclosed_socketpair0_immediate_writeempty, tc)
   1437 {
   1438 	int writefd, readfd;
   1439 
   1440 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1441 	/* don't fill the pipe buf */
   1442 	check_pollclosed_immediate_write(writefd, readfd);
   1443 }
   1444 
   1445 ATF_TC(pollclosed_socketpair0_immediate_readsome);
   1446 ATF_TC_HEAD(pollclosed_socketpair0_immediate_readsome, tc)
   1447 {
   1448 	atf_tc_set_md_var(tc, "descr",
   1449 	    "Checks POLLHUP with closing the first half of a socketpair");
   1450 }
   1451 ATF_TC_BODY(pollclosed_socketpair0_immediate_readsome, tc)
   1452 {
   1453 	int writefd, readfd;
   1454 
   1455 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1456 	fillpipebuf(writefd);
   1457 	check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
   1458 }
   1459 
   1460 ATF_TC(pollclosed_socketpair0_immediate_readnone);
   1461 ATF_TC_HEAD(pollclosed_socketpair0_immediate_readnone, tc)
   1462 {
   1463 	atf_tc_set_md_var(tc, "descr",
   1464 	    "Checks POLLHUP with closing the first half of a socketpair");
   1465 }
   1466 ATF_TC_BODY(pollclosed_socketpair0_immediate_readnone, tc)
   1467 {
   1468 	int writefd, readfd;
   1469 
   1470 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1471 	/* don't fill the pipe buf */
   1472 	check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
   1473 }
   1474 
   1475 ATF_TC(pollclosed_socketpair0_delayed_process_write);
   1476 ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_write, tc)
   1477 {
   1478 	atf_tc_set_md_var(tc, "descr",
   1479 	    "Checks POLLHUP with closing the first half of a socketpair");
   1480 }
   1481 ATF_TC_BODY(pollclosed_socketpair0_delayed_process_write, tc)
   1482 {
   1483 	int writefd, readfd;
   1484 
   1485 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1486 	fillpipebuf(writefd);
   1487 	check_pollclosed_delayed_process(writefd, readfd,
   1488 	    &check_pollclosed_delayed_write);
   1489 }
   1490 
   1491 ATF_TC(pollclosed_socketpair0_delayed_process_read);
   1492 ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_read, tc)
   1493 {
   1494 	atf_tc_set_md_var(tc, "descr",
   1495 	    "Checks POLLHUP with closing the first half of a socketpair");
   1496 }
   1497 ATF_TC_BODY(pollclosed_socketpair0_delayed_process_read, tc)
   1498 {
   1499 	int writefd, readfd;
   1500 
   1501 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1502 	/* don't fill pipe buf */
   1503 	check_pollclosed_delayed_process(readfd, writefd,
   1504 	    &check_pollclosed_delayed_read_socket);
   1505 }
   1506 
   1507 ATF_TC(pollclosed_socketpair0_delayed_thread_write);
   1508 ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_write, tc)
   1509 {
   1510 	atf_tc_set_md_var(tc, "descr",
   1511 	    "Checks POLLHUP with closing the first half of a socketpair");
   1512 }
   1513 ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_write, tc)
   1514 {
   1515 	int writefd, readfd;
   1516 
   1517 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1518 	fillpipebuf(writefd);
   1519 	check_pollclosed_delayed_thread(writefd, readfd,
   1520 	    &check_pollclosed_delayed_write);
   1521 }
   1522 
   1523 ATF_TC(pollclosed_socketpair0_delayed_thread_read);
   1524 ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_read, tc)
   1525 {
   1526 	atf_tc_set_md_var(tc, "descr",
   1527 	    "Checks POLLHUP with closing the first half of a socketpair");
   1528 }
   1529 ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_read, tc)
   1530 {
   1531 	int writefd, readfd;
   1532 
   1533 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1534 	/* don't fill pipe buf */
   1535 	check_pollclosed_delayed_thread(readfd, writefd,
   1536 	    &check_pollclosed_delayed_read_socket);
   1537 }
   1538 
   1539 ATF_TC(pollclosed_socketpair1_immediate_writefull);
   1540 ATF_TC_HEAD(pollclosed_socketpair1_immediate_writefull, tc)
   1541 {
   1542 	atf_tc_set_md_var(tc, "descr",
   1543 	    "Checks POLLHUP with closing the second half of a socketpair");
   1544 }
   1545 ATF_TC_BODY(pollclosed_socketpair1_immediate_writefull, tc)
   1546 {
   1547 	int writefd, readfd;
   1548 
   1549 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1550 	fillpipebuf(writefd);
   1551 	check_pollclosed_immediate_write(writefd, readfd);
   1552 }
   1553 
   1554 ATF_TC(pollclosed_socketpair1_immediate_writeempty);
   1555 ATF_TC_HEAD(pollclosed_socketpair1_immediate_writeempty, tc)
   1556 {
   1557 	atf_tc_set_md_var(tc, "descr",
   1558 	    "Checks POLLHUP with closing the second half of a socketpair");
   1559 }
   1560 ATF_TC_BODY(pollclosed_socketpair1_immediate_writeempty, tc)
   1561 {
   1562 	int writefd, readfd;
   1563 
   1564 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1565 	/* don't fill the pipe buf */
   1566 	check_pollclosed_immediate_write(writefd, readfd);
   1567 }
   1568 
   1569 ATF_TC(pollclosed_socketpair1_immediate_readsome);
   1570 ATF_TC_HEAD(pollclosed_socketpair1_immediate_readsome, tc)
   1571 {
   1572 	atf_tc_set_md_var(tc, "descr",
   1573 	    "Checks POLLHUP with closing the second half of a socketpair");
   1574 }
   1575 ATF_TC_BODY(pollclosed_socketpair1_immediate_readsome, tc)
   1576 {
   1577 	int writefd, readfd;
   1578 
   1579 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1580 	fillpipebuf(writefd);
   1581 	check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
   1582 }
   1583 
   1584 ATF_TC(pollclosed_socketpair1_immediate_readnone);
   1585 ATF_TC_HEAD(pollclosed_socketpair1_immediate_readnone, tc)
   1586 {
   1587 	atf_tc_set_md_var(tc, "descr",
   1588 	    "Checks POLLHUP with closing the second half of a socketpair");
   1589 }
   1590 ATF_TC_BODY(pollclosed_socketpair1_immediate_readnone, tc)
   1591 {
   1592 	int writefd, readfd;
   1593 
   1594 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1595 	/* don't fill the pipe buf */
   1596 	check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
   1597 }
   1598 
   1599 ATF_TC(pollclosed_socketpair1_delayed_process_write);
   1600 ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_write, tc)
   1601 {
   1602 	atf_tc_set_md_var(tc, "descr",
   1603 	    "Checks POLLHUP with closing the second half of a socketpair");
   1604 }
   1605 ATF_TC_BODY(pollclosed_socketpair1_delayed_process_write, tc)
   1606 {
   1607 	int writefd, readfd;
   1608 
   1609 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1610 	fillpipebuf(writefd);
   1611 	check_pollclosed_delayed_process(writefd, readfd,
   1612 	    &check_pollclosed_delayed_write);
   1613 }
   1614 
   1615 ATF_TC(pollclosed_socketpair1_delayed_process_read);
   1616 ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_read, tc)
   1617 {
   1618 	atf_tc_set_md_var(tc, "descr",
   1619 	    "Checks POLLHUP with closing the second half of a socketpair");
   1620 }
   1621 ATF_TC_BODY(pollclosed_socketpair1_delayed_process_read, tc)
   1622 {
   1623 	int writefd, readfd;
   1624 
   1625 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1626 	/* don't fill pipe buf */
   1627 	check_pollclosed_delayed_process(readfd, writefd,
   1628 	    &check_pollclosed_delayed_read_socket);
   1629 }
   1630 
   1631 ATF_TC(pollclosed_socketpair1_delayed_thread_write);
   1632 ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_write, tc)
   1633 {
   1634 	atf_tc_set_md_var(tc, "descr",
   1635 	    "Checks POLLHUP with closing the second half of a socketpair");
   1636 }
   1637 ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_write, tc)
   1638 {
   1639 	int writefd, readfd;
   1640 
   1641 	pollclosed_socketpair1_setup(&writefd, &readfd);
   1642 	fillpipebuf(writefd);
   1643 	check_pollclosed_delayed_thread(writefd, readfd,
   1644 	    &check_pollclosed_delayed_write);
   1645 }
   1646 
   1647 ATF_TC(pollclosed_socketpair1_delayed_thread_read);
   1648 ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_read, tc)
   1649 {
   1650 	atf_tc_set_md_var(tc, "descr",
   1651 	    "Checks POLLHUP with closing the second half of a socketpair");
   1652 }
   1653 ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_read, tc)
   1654 {
   1655 	int writefd, readfd;
   1656 
   1657 	pollclosed_socketpair0_setup(&writefd, &readfd);
   1658 	/* don't fill pipe buf */
   1659 	check_pollclosed_delayed_process(readfd, writefd,
   1660 	    &check_pollclosed_delayed_read_socket);
   1661 }
   1662 
   1663 ATF_TP_ADD_TCS(tp)
   1664 {
   1665 
   1666 	ATF_TP_ADD_TC(tp, 3way);
   1667 	ATF_TP_ADD_TC(tp, basic);
   1668 	ATF_TP_ADD_TC(tp, err);
   1669 
   1670 	ATF_TP_ADD_TC(tp, fifo_inout);
   1671 	ATF_TP_ADD_TC(tp, fifo_hup1);
   1672 	ATF_TP_ADD_TC(tp, fifo_hup2);
   1673 
   1674 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writefull);
   1675 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writefull);
   1676 	ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writefull);
   1677 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writefull);
   1678 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writefull);
   1679 
   1680 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writeempty);
   1681 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writeempty);
   1682 	ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writeempty);
   1683 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writeempty);
   1684 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writeempty);
   1685 
   1686 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readsome);
   1687 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readsome);
   1688 	ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readsome);
   1689 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readsome);
   1690 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readsome);
   1691 
   1692 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readnone);
   1693 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readnone);
   1694 	ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readnone);
   1695 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readnone);
   1696 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readnone);
   1697 
   1698 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_write);
   1699 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_write);
   1700 	ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_write);
   1701 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_write);
   1702 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_write);
   1703 
   1704 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_read);
   1705 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_read);
   1706 	ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_read);
   1707 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_read);
   1708 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_read);
   1709 
   1710 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_write);
   1711 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_write);
   1712 	ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_write);
   1713 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_write);
   1714 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_write);
   1715 
   1716 	ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_read);
   1717 	ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_read);
   1718 	ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_read);
   1719 	ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_read);
   1720 	ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_read);
   1721 
   1722 	return atf_no_error();
   1723 }
   1724