xref: /openbsd-src/regress/sys/kern/kqueue/kqueue-pipe.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*	$OpenBSD: kqueue-pipe.c,v 1.6 2015/08/13 10:13:05 uebayasi 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 #include <sys/types.h>
32 #include <sys/time.h>
33 #include <sys/event.h>
34 #include <stdio.h>
35 #include <unistd.h>
36 #include <fcntl.h>
37 #include <string.h>
38 
39 int do_pipe(void);
40 
41 int
42 do_pipe(void)
43 {
44 	int kq;
45 	int n;
46 	int fd[2];
47 	struct kevent ev;
48 	struct timespec ts;
49 	char buf[8000];
50 
51 	if (pipe(fd) == -1)
52 		return (1);
53 	if (fcntl(fd[1], F_SETFL, O_NONBLOCK) == -1)
54 		return (1);
55 
56 	if ((kq = kqueue()) == -1)
57 		return (1);
58 
59 	memset(&ev, 0, sizeof(ev));
60 	ev.ident = fd[1];
61 	ev.filter = EVFILT_WRITE;
62 	ev.flags = EV_ADD | EV_ENABLE;
63 	n = kevent(kq, &ev, 1, NULL, 0, NULL);
64 	if (n == -1)
65 		return (1);
66 
67 	memset(buf, 0, sizeof(buf));
68 	while ((n = write(fd[1], buf, sizeof(buf))) == sizeof(buf))
69 		;
70 
71 	ts.tv_sec = 0;
72 	ts.tv_nsec = 0;
73 	n = kevent(kq, NULL, 0, &ev, 1, &ts);
74 	if (n != 0)
75 		return (1);
76 
77 	read(fd[0], buf, sizeof(buf));
78 
79 	ts.tv_sec = 0;
80 	ts.tv_nsec = 0;
81 	n = kevent(kq, NULL, 0, &ev, 1, &ts);
82 	if (n == -1 || n == 0)
83 		return (1);
84 
85 	close(fd[0]);
86 	close(fd[1]);
87 	return (0);
88 }
89