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