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