xref: /openbsd-src/regress/sys/kern/kqueue/kqueue-pipe.c (revision bd35765dfde630203782d36f741b7bde1f9f8a3e)
1*bd35765dSbluhm /*	$OpenBSD: kqueue-pipe.c,v 1.7 2016/09/20 23:05:27 bluhm Exp $	*/
2ba1be4c8Sprovos /*
3ba1be4c8Sprovos  * Copyright 2001 Niels Provos <provos@citi.umich.edu>
4ba1be4c8Sprovos  * All rights reserved.
5ba1be4c8Sprovos  *
6ba1be4c8Sprovos  * Redistribution and use in source and binary forms, with or without
7ba1be4c8Sprovos  * modification, are permitted provided that the following conditions
8ba1be4c8Sprovos  * are met:
9ba1be4c8Sprovos  * 1. Redistributions of source code must retain the above copyright
10ba1be4c8Sprovos  *    notice, this list of conditions and the following disclaimer.
11ba1be4c8Sprovos  * 2. Redistributions in binary form must reproduce the above copyright
12ba1be4c8Sprovos  *    notice, this list of conditions and the following disclaimer in the
13ba1be4c8Sprovos  *    documentation and/or other materials provided with the distribution.
14ba1be4c8Sprovos  * 3. All advertising materials mentioning features or use of this software
15ba1be4c8Sprovos  *    must display the following acknowledgement:
16ba1be4c8Sprovos  *      This product includes software developed by Niels Provos.
17ba1be4c8Sprovos  * 4. The name of the author may not be used to endorse or promote products
18ba1be4c8Sprovos  *    derived from this software without specific prior written permission.
19ba1be4c8Sprovos  *
20ba1be4c8Sprovos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21ba1be4c8Sprovos  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22ba1be4c8Sprovos  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23ba1be4c8Sprovos  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24ba1be4c8Sprovos  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25ba1be4c8Sprovos  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ba1be4c8Sprovos  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ba1be4c8Sprovos  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ba1be4c8Sprovos  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29ba1be4c8Sprovos  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ba1be4c8Sprovos  */
31*bd35765dSbluhm 
32ba1be4c8Sprovos #include <sys/types.h>
33ba1be4c8Sprovos #include <sys/time.h>
34ba1be4c8Sprovos #include <sys/event.h>
35ba1be4c8Sprovos 
36*bd35765dSbluhm #include <err.h>
37*bd35765dSbluhm #include <fcntl.h>
38*bd35765dSbluhm #include <stdio.h>
39*bd35765dSbluhm #include <string.h>
40*bd35765dSbluhm #include <unistd.h>
41*bd35765dSbluhm 
42*bd35765dSbluhm #include "main.h"
43db3296cfSderaadt 
44ba1be4c8Sprovos int
do_pipe(void)455a789c51Sart do_pipe(void)
46ba1be4c8Sprovos {
47ba1be4c8Sprovos 	int kq;
48ba1be4c8Sprovos 	int n;
49ba1be4c8Sprovos 	int fd[2];
50ba1be4c8Sprovos 	struct kevent ev;
51ba1be4c8Sprovos 	struct timespec ts;
52ba1be4c8Sprovos 	char buf[8000];
53ba1be4c8Sprovos 
54*bd35765dSbluhm 	ASS(pipe(fd) == 0,
55*bd35765dSbluhm 	    warn("pipe"));
56*bd35765dSbluhm 	ASS(fcntl(fd[1], F_SETFL, O_NONBLOCK) == 0,
57*bd35765dSbluhm 	    warn("fcntl"));
58ba1be4c8Sprovos 
59*bd35765dSbluhm 	ASS((kq = kqueue()) >= 0,
60*bd35765dSbluhm 	    warn("fcntl"));
61ba1be4c8Sprovos 
622089cc87Suebayasi 	memset(&ev, 0, sizeof(ev));
63ba1be4c8Sprovos 	ev.ident = fd[1];
64ba1be4c8Sprovos 	ev.filter = EVFILT_WRITE;
65ba1be4c8Sprovos 	ev.flags = EV_ADD | EV_ENABLE;
66ba1be4c8Sprovos 	n = kevent(kq, &ev, 1, NULL, 0, NULL);
67*bd35765dSbluhm 	ASSX(n != -1);
68ba1be4c8Sprovos 
692089cc87Suebayasi 	memset(buf, 0, sizeof(buf));
708fd1ff48Sprovos 	while ((n = write(fd[1], buf, sizeof(buf))) == sizeof(buf))
718fd1ff48Sprovos 		;
728fd1ff48Sprovos 
738fd1ff48Sprovos 	ts.tv_sec = 0;
748fd1ff48Sprovos 	ts.tv_nsec = 0;
758fd1ff48Sprovos 	n = kevent(kq, NULL, 0, &ev, 1, &ts);
76*bd35765dSbluhm 	ASSX(n == 0);
778fd1ff48Sprovos 
78ba1be4c8Sprovos 	read(fd[0], buf, sizeof(buf));
79ba1be4c8Sprovos 
80ba1be4c8Sprovos 	ts.tv_sec = 0;
81ba1be4c8Sprovos 	ts.tv_nsec = 0;
82ba1be4c8Sprovos 	n = kevent(kq, NULL, 0, &ev, 1, &ts);
83*bd35765dSbluhm 	ASSX(n != -1 && n != 0);
84ba1be4c8Sprovos 
852089cc87Suebayasi 	close(fd[0]);
862089cc87Suebayasi 	close(fd[1]);
875a789c51Sart 	return (0);
88ba1be4c8Sprovos }
89