OSDN Git Service

initial commit
[openbsd-octeon/openbsd-octeon.git] / src / regress / sys / kern / kqueue / kqueue-pipe.c
1 /*      $OpenBSD: kqueue-pipe.c,v 1.4 2003/07/31 21:48:08 deraadt 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
38 int do_pipe(void);
39
40 int
41 do_pipe(void)
42 {
43         int kq;
44         int n;
45         int fd[2];
46         struct kevent ev;
47         struct timespec ts;
48         char buf[8000];
49
50         if (pipe(fd) == -1)
51                 return (1);
52         if (fcntl(fd[1], F_SETFL, O_NONBLOCK) == -1)
53                 return (1);
54
55         if ((kq = kqueue()) == -1)
56                 return (1);
57
58         ev.ident = fd[1];
59         ev.filter = EVFILT_WRITE;
60         ev.flags = EV_ADD | EV_ENABLE;
61         n = kevent(kq, &ev, 1, NULL, 0, NULL);
62         if (n == -1)
63                 return (1);
64         
65         while ((n = write(fd[1], buf, sizeof(buf))) == sizeof(buf))
66                 ;
67
68         ts.tv_sec = 0;
69         ts.tv_nsec = 0;
70         n = kevent(kq, NULL, 0, &ev, 1, &ts);
71         if (n != 0)
72                 return (1);
73
74         read(fd[0], buf, sizeof(buf));
75
76         ts.tv_sec = 0;
77         ts.tv_nsec = 0;
78         n = kevent(kq, NULL, 0, &ev, 1, &ts);
79         if (n == -1 || n == 0)
80                 return (1);
81
82         return (0);
83 }