162967fb0SRobert Watson /*-
262967fb0SRobert Watson * Copyright (c) 2004 Robert N. M. Watson
362967fb0SRobert Watson * All rights reserved.
462967fb0SRobert Watson *
562967fb0SRobert Watson * Redistribution and use in source and binary forms, with or without
662967fb0SRobert Watson * modification, are permitted provided that the following conditions
762967fb0SRobert Watson * are met:
862967fb0SRobert Watson * 1. Redistributions of source code must retain the above copyright
962967fb0SRobert Watson * notice, this list of conditions and the following disclaimer.
1062967fb0SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright
1162967fb0SRobert Watson * notice, this list of conditions and the following disclaimer in the
1262967fb0SRobert Watson * documentation and/or other materials provided with the distribution.
1362967fb0SRobert Watson *
1462967fb0SRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1562967fb0SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1662967fb0SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1762967fb0SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1862967fb0SRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1962967fb0SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2062967fb0SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2162967fb0SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2262967fb0SRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2362967fb0SRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2462967fb0SRobert Watson * SUCH DAMAGE.
2562967fb0SRobert Watson *
2662967fb0SRobert Watson * $FreeBSD$
2762967fb0SRobert Watson */
2862967fb0SRobert Watson
2962967fb0SRobert Watson #include <sys/types.h>
3062967fb0SRobert Watson #include <sys/event.h>
3162967fb0SRobert Watson #include <sys/socket.h>
3262967fb0SRobert Watson #include <sys/time.h>
3362967fb0SRobert Watson
3462967fb0SRobert Watson #include <errno.h>
3562967fb0SRobert Watson #include <fcntl.h>
3662967fb0SRobert Watson #include <stdio.h>
3762967fb0SRobert Watson #include <stdlib.h>
3862967fb0SRobert Watson #include <string.h>
3962967fb0SRobert Watson #include <unistd.h>
4062967fb0SRobert Watson
4100e13b1dSNik Clayton static int curtest = 1;
4200e13b1dSNik Clayton
4362967fb0SRobert Watson /*-
4462967fb0SRobert Watson * This test uses UNIX domain socket pairs to perform some basic exercising
4562967fb0SRobert Watson * of kqueue functionality on sockets. In particular, testing that for read
4662967fb0SRobert Watson * and write filters, we see the correct detection of whether reads and
4762967fb0SRobert Watson * writes should actually be able to occur.
4862967fb0SRobert Watson *
4962967fb0SRobert Watson * TODO:
5062967fb0SRobert Watson * - Test read/write filters for listen/accept sockets.
5162967fb0SRobert Watson * - Handle the XXXRW below regarding datagram sockets.
5262967fb0SRobert Watson * - Test that watermark/buffer size "data" fields returned by kqueue are
5362967fb0SRobert Watson * correct.
5462967fb0SRobert Watson * - Check that kqueue does something sensible when the remote endpoing is
5562967fb0SRobert Watson * closed.
5662967fb0SRobert Watson */
5762967fb0SRobert Watson
5800e13b1dSNik Clayton #define OK(testname) printf("ok %d - %s\n", curtest, testname); \
5900e13b1dSNik Clayton curtest++;
6000e13b1dSNik Clayton
6162967fb0SRobert Watson static void
fail(int error,const char * func,const char * socktype,const char * rest)6262967fb0SRobert Watson fail(int error, const char *func, const char *socktype, const char *rest)
6362967fb0SRobert Watson {
6462967fb0SRobert Watson
6500e13b1dSNik Clayton printf("not ok %d\n", curtest);
6662967fb0SRobert Watson
6762967fb0SRobert Watson if (socktype == NULL)
6800e13b1dSNik Clayton printf("# %s(): %s\n", func, strerror(error));
6962967fb0SRobert Watson else if (rest == NULL)
7000e13b1dSNik Clayton printf("# %s(%s): %s\n", func, socktype,
7162967fb0SRobert Watson strerror(error));
7262967fb0SRobert Watson else
7300e13b1dSNik Clayton printf("# %s(%s, %s): %s\n", func, socktype, rest,
7462967fb0SRobert Watson strerror(error));
7562967fb0SRobert Watson exit(-1);
7662967fb0SRobert Watson }
7762967fb0SRobert Watson
7862967fb0SRobert Watson static void
fail_assertion(const char * func,const char * socktype,const char * rest,const char * assertion)7962967fb0SRobert Watson fail_assertion(const char *func, const char *socktype, const char *rest,
8062967fb0SRobert Watson const char *assertion)
8162967fb0SRobert Watson {
8262967fb0SRobert Watson
8300e13b1dSNik Clayton printf("not ok %d - %s\n", curtest, assertion);
8462967fb0SRobert Watson
8562967fb0SRobert Watson if (socktype == NULL)
8600e13b1dSNik Clayton printf("# %s(): assertion %s failed\n", func,
8762967fb0SRobert Watson assertion);
8862967fb0SRobert Watson else if (rest == NULL)
8900e13b1dSNik Clayton printf("# %s(%s): assertion %s failed\n", func,
9062967fb0SRobert Watson socktype, assertion);
9162967fb0SRobert Watson else
9200e13b1dSNik Clayton printf("# %s(%s, %s): assertion %s failed\n", func,
9362967fb0SRobert Watson socktype, rest, assertion);
9462967fb0SRobert Watson exit(-1);
9562967fb0SRobert Watson }
9662967fb0SRobert Watson
9762967fb0SRobert Watson /*
9862967fb0SRobert Watson * Test read kevent on a socket pair: check to make sure endpoint 0 isn't
9962967fb0SRobert Watson * readable when we start, then write to endpoint 1 and confirm that endpoint
10062967fb0SRobert Watson * 0 is now readable. Drain the write, then check that it's not readable
10162967fb0SRobert Watson * again. Use non-blocking kqueue operations and socket operations.
10262967fb0SRobert Watson */
10362967fb0SRobert Watson static void
test_evfilt_read(int kq,int fd[2],const char * socktype)10462967fb0SRobert Watson test_evfilt_read(int kq, int fd[2], const char *socktype)
10562967fb0SRobert Watson {
10662967fb0SRobert Watson struct timespec ts;
10762967fb0SRobert Watson struct kevent ke;
10862967fb0SRobert Watson ssize_t len;
10962967fb0SRobert Watson char ch;
11062967fb0SRobert Watson int i;
11162967fb0SRobert Watson
11262967fb0SRobert Watson EV_SET(&ke, fd[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
11362967fb0SRobert Watson if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
11462967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_READ, EV_ADD");
11500e13b1dSNik Clayton OK("EVFILT_READ, EV_ADD");
11662967fb0SRobert Watson
11762967fb0SRobert Watson /*
11862967fb0SRobert Watson * Confirm not readable to begin with, no I/O yet.
11962967fb0SRobert Watson */
12062967fb0SRobert Watson ts.tv_sec = 0;
12162967fb0SRobert Watson ts.tv_nsec = 0;
12262967fb0SRobert Watson i = kevent(kq, NULL, 0, &ke, 1, &ts);
12362967fb0SRobert Watson if (i == -1)
12462967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_READ");
12500e13b1dSNik Clayton OK("EVFILT_READ");
12662967fb0SRobert Watson if (i != 0)
12762967fb0SRobert Watson fail_assertion("kevent", socktype, "EVFILT_READ",
12862967fb0SRobert Watson "empty socket unreadable");
12900e13b1dSNik Clayton OK("empty socket unreadable");
13062967fb0SRobert Watson
13162967fb0SRobert Watson /*
13262967fb0SRobert Watson * Write a byte to one end.
13362967fb0SRobert Watson */
13462967fb0SRobert Watson ch = 'a';
13562967fb0SRobert Watson len = write(fd[1], &ch, sizeof(ch));
13662967fb0SRobert Watson if (len == -1)
13762967fb0SRobert Watson fail(errno, "write", socktype, NULL);
13800e13b1dSNik Clayton OK("write one byte");
13962967fb0SRobert Watson if (len != sizeof(ch))
14062967fb0SRobert Watson fail_assertion("write", socktype, NULL, "write length");
14100e13b1dSNik Clayton OK("write one byte length");
14262967fb0SRobert Watson
14362967fb0SRobert Watson /*
14462967fb0SRobert Watson * Other end should now be readable.
14562967fb0SRobert Watson */
14662967fb0SRobert Watson ts.tv_sec = 0;
14762967fb0SRobert Watson ts.tv_nsec = 0;
14862967fb0SRobert Watson i = kevent(kq, NULL, 0, &ke, 1, &ts);
14962967fb0SRobert Watson if (i == -1)
15062967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_READ");
15100e13b1dSNik Clayton OK("EVFILT_READ");
15262967fb0SRobert Watson if (i != 1)
15362967fb0SRobert Watson fail_assertion("kevent", socktype, "EVFILT_READ",
15462967fb0SRobert Watson "non-empty socket unreadable");
15500e13b1dSNik Clayton OK("non-empty socket unreadable");
15662967fb0SRobert Watson
15762967fb0SRobert Watson /*
15862967fb0SRobert Watson * Read a byte to clear the readable state.
15962967fb0SRobert Watson */
16062967fb0SRobert Watson len = read(fd[0], &ch, sizeof(ch));
16162967fb0SRobert Watson if (len == -1)
16262967fb0SRobert Watson fail(errno, "read", socktype, NULL);
16300e13b1dSNik Clayton OK("read one byte");
16462967fb0SRobert Watson if (len != sizeof(ch))
16562967fb0SRobert Watson fail_assertion("read", socktype, NULL, "read length");
16600e13b1dSNik Clayton OK("read one byte length");
16762967fb0SRobert Watson
16862967fb0SRobert Watson /*
16962967fb0SRobert Watson * Now re-check for readability.
17062967fb0SRobert Watson */
17162967fb0SRobert Watson ts.tv_sec = 0;
17262967fb0SRobert Watson ts.tv_nsec = 0;
17362967fb0SRobert Watson i = kevent(kq, NULL, 0, &ke, 1, &ts);
17462967fb0SRobert Watson if (i == -1)
17562967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_READ");
17600e13b1dSNik Clayton OK("EVFILT_READ");
17762967fb0SRobert Watson if (i != 0)
17862967fb0SRobert Watson fail_assertion("kevent", socktype, "EVFILT_READ",
17962967fb0SRobert Watson "empty socket unreadable");
18000e13b1dSNik Clayton OK("empty socket unreadable");
18162967fb0SRobert Watson
18262967fb0SRobert Watson EV_SET(&ke, fd[0], EVFILT_READ, EV_DELETE, 0, 0, NULL);
18362967fb0SRobert Watson if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
18462967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_READ, EV_DELETE");
18500e13b1dSNik Clayton OK("EVFILT_READ, EV_DELETE");
18662967fb0SRobert Watson }
18762967fb0SRobert Watson
18862967fb0SRobert Watson static void
test_evfilt_write(int kq,int fd[2],const char * socktype)18962967fb0SRobert Watson test_evfilt_write(int kq, int fd[2], const char *socktype)
19062967fb0SRobert Watson {
19162967fb0SRobert Watson struct timespec ts;
19262967fb0SRobert Watson struct kevent ke;
19362967fb0SRobert Watson ssize_t len;
19462967fb0SRobert Watson char ch;
19562967fb0SRobert Watson int i;
19662967fb0SRobert Watson
19762967fb0SRobert Watson EV_SET(&ke, fd[0], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
19862967fb0SRobert Watson if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
19962967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_WRITE, EV_ADD");
20000e13b1dSNik Clayton OK("EVFILE_WRITE, EV_ADD");
20162967fb0SRobert Watson
20262967fb0SRobert Watson /*
20362967fb0SRobert Watson * Confirm writable to begin with, no I/O yet.
20462967fb0SRobert Watson */
20562967fb0SRobert Watson ts.tv_sec = 0;
20662967fb0SRobert Watson ts.tv_nsec = 0;
20762967fb0SRobert Watson i = kevent(kq, NULL, 0, &ke, 1, &ts);
20862967fb0SRobert Watson if (i == -1)
20962967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_WRITE");
21000e13b1dSNik Clayton OK("EVFILE_WRITE");
21162967fb0SRobert Watson if (i != 1)
21262967fb0SRobert Watson fail_assertion("kevent", socktype, "EVFILT_WRITE",
21362967fb0SRobert Watson "empty socket unwritable");
21400e13b1dSNik Clayton OK("empty socket unwritable");
21562967fb0SRobert Watson
21662967fb0SRobert Watson /*
21762967fb0SRobert Watson * Write bytes into the socket until we can't write anymore.
21862967fb0SRobert Watson */
21962967fb0SRobert Watson ch = 'a';
22062967fb0SRobert Watson while ((len = write(fd[0], &ch, sizeof(ch))) == sizeof(ch)) {};
22162967fb0SRobert Watson if (len == -1 && errno != EAGAIN && errno != ENOBUFS)
22262967fb0SRobert Watson fail(errno, "write", socktype, NULL);
22300e13b1dSNik Clayton OK("write");
22462967fb0SRobert Watson if (len != -1 && len != sizeof(ch))
22562967fb0SRobert Watson fail_assertion("write", socktype, NULL, "write length");
22600e13b1dSNik Clayton OK("write length");
22762967fb0SRobert Watson
22862967fb0SRobert Watson /*
22962967fb0SRobert Watson * Check to make sure the socket is no longer writable.
23062967fb0SRobert Watson */
23162967fb0SRobert Watson ts.tv_sec = 0;
23262967fb0SRobert Watson ts.tv_nsec = 0;
23362967fb0SRobert Watson i = kevent(kq, NULL, 0, &ke, 1, &ts);
23462967fb0SRobert Watson if (i == -1)
23562967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_WRITE");
23600e13b1dSNik Clayton OK("EVFILT_WRITE");
23762967fb0SRobert Watson if (i != 0)
23862967fb0SRobert Watson fail_assertion("kevent", socktype, "EVFILT_WRITE",
23962967fb0SRobert Watson "full socket writable");
24000e13b1dSNik Clayton OK("full socket writable");
24162967fb0SRobert Watson
24262967fb0SRobert Watson EV_SET(&ke, fd[0], EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
24362967fb0SRobert Watson if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
24462967fb0SRobert Watson fail(errno, "kevent", socktype, "EVFILT_WRITE, EV_DELETE");
24500e13b1dSNik Clayton OK("EVFILT_WRITE, EV_DELETE");
24662967fb0SRobert Watson }
24762967fb0SRobert Watson
24862967fb0SRobert Watson /*
24962967fb0SRobert Watson * Basic registration exercise for kqueue(2). Create several types/brands of
25062967fb0SRobert Watson * sockets, and confirm that we can register for various events on them.
25162967fb0SRobert Watson */
25262967fb0SRobert Watson int
main(void)253*957885bfSEnji Cooper main(void)
25462967fb0SRobert Watson {
255*957885bfSEnji Cooper int kq, sv[2];
25662967fb0SRobert Watson
25700e13b1dSNik Clayton printf("1..49\n");
25800e13b1dSNik Clayton
25962967fb0SRobert Watson kq = kqueue();
26062967fb0SRobert Watson if (kq == -1)
26162967fb0SRobert Watson fail(errno, "kqueue", NULL, NULL);
26200e13b1dSNik Clayton OK("kqueue()");
26362967fb0SRobert Watson
26462967fb0SRobert Watson /*
26562967fb0SRobert Watson * Create a UNIX domain datagram socket, and attach/test/detach a
26662967fb0SRobert Watson * read filter on it.
26762967fb0SRobert Watson */
26862967fb0SRobert Watson if (socketpair(PF_UNIX, SOCK_DGRAM, 0, sv) == -1)
26962967fb0SRobert Watson fail(errno, "socketpair", "PF_UNIX, SOCK_DGRAM", NULL);
27000e13b1dSNik Clayton OK("socketpair() 1");
27162967fb0SRobert Watson
272accbe494SRobert Watson if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
27362967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
27400e13b1dSNik Clayton OK("fcntl() 1");
275accbe494SRobert Watson if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
27662967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
27700e13b1dSNik Clayton OK("fnctl() 2");
27862967fb0SRobert Watson
27962967fb0SRobert Watson test_evfilt_read(kq, sv, "PF_UNIX, SOCK_DGRAM");
28062967fb0SRobert Watson
28162967fb0SRobert Watson if (close(sv[0]) == -1)
28262967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[0]");
28300e13b1dSNik Clayton OK("close() 1");
28462967fb0SRobert Watson if (close(sv[1]) == -1)
28562967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[1]");
28600e13b1dSNik Clayton OK("close() 2");
28762967fb0SRobert Watson
28862967fb0SRobert Watson #if 0
28962967fb0SRobert Watson /*
29062967fb0SRobert Watson * XXXRW: We disable the write test in the case of datagram sockets,
29162967fb0SRobert Watson * as kqueue can't tell when the remote socket receive buffer is
29262967fb0SRobert Watson * full, whereas the UNIX domain socket implementation can tell and
29362967fb0SRobert Watson * returns ENOBUFS.
29462967fb0SRobert Watson */
29562967fb0SRobert Watson /*
29662967fb0SRobert Watson * Create a UNIX domain datagram socket, and attach/test/detach a
29762967fb0SRobert Watson * write filter on it.
29862967fb0SRobert Watson */
29962967fb0SRobert Watson if (socketpair(PF_UNIX, SOCK_DGRAM, 0, sv) == -1)
30062967fb0SRobert Watson fail(errno, "socketpair", "PF_UNIX, SOCK_DGRAM", NULL);
30162967fb0SRobert Watson
302accbe494SRobert Watson if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
30362967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
304accbe494SRobert Watson if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
30562967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
30662967fb0SRobert Watson
30762967fb0SRobert Watson test_evfilt_write(kq, sv, "PF_UNIX, SOCK_DGRAM");
30862967fb0SRobert Watson
30962967fb0SRobert Watson if (close(sv[0]) == -1)
31062967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[0]");
31162967fb0SRobert Watson if (close(sv[1]) == -1)
31262967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[1]");
31362967fb0SRobert Watson #endif
31462967fb0SRobert Watson
31562967fb0SRobert Watson /*
31662967fb0SRobert Watson * Create a UNIX domain stream socket, and attach/test/detach a
31762967fb0SRobert Watson * read filter on it.
31862967fb0SRobert Watson */
31962967fb0SRobert Watson if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
32062967fb0SRobert Watson fail(errno, "socketpair", "PF_UNIX, SOCK_STREAM", NULL);
32100e13b1dSNik Clayton OK("socketpair() 2");
32262967fb0SRobert Watson
323accbe494SRobert Watson if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
32462967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
32500e13b1dSNik Clayton OK("fcntl() 3");
326accbe494SRobert Watson if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
32762967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
32800e13b1dSNik Clayton OK("fcntl() 4");
32962967fb0SRobert Watson
33062967fb0SRobert Watson test_evfilt_read(kq, sv, "PF_UNIX, SOCK_STREAM");
33162967fb0SRobert Watson
33262967fb0SRobert Watson if (close(sv[0]) == -1)
33362967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[0]");
33400e13b1dSNik Clayton OK("close() 3");
33562967fb0SRobert Watson if (close(sv[1]) == -1)
33662967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[1]");
33700e13b1dSNik Clayton OK("close() 4");
33862967fb0SRobert Watson
33962967fb0SRobert Watson /*
34062967fb0SRobert Watson * Create a UNIX domain stream socket, and attach/test/detach a
34162967fb0SRobert Watson * write filter on it.
34262967fb0SRobert Watson */
34362967fb0SRobert Watson if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
34462967fb0SRobert Watson fail(errno, "socketpair", "PF_UNIX, SOCK_STREAM", NULL);
34500e13b1dSNik Clayton OK("socketpair() 3");
34662967fb0SRobert Watson
347accbe494SRobert Watson if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
34862967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
34900e13b1dSNik Clayton OK("fcntl() 5");
350accbe494SRobert Watson if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
35162967fb0SRobert Watson fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
35200e13b1dSNik Clayton OK("fcntl() 6");
35362967fb0SRobert Watson
35462967fb0SRobert Watson test_evfilt_write(kq, sv, "PF_UNIX, SOCK_STREAM");
35562967fb0SRobert Watson
35662967fb0SRobert Watson if (close(sv[0]) == -1)
35762967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[0]");
35800e13b1dSNik Clayton OK("close() 5");
35962967fb0SRobert Watson if (close(sv[1]) == -1)
36062967fb0SRobert Watson fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[1]");
36100e13b1dSNik Clayton OK("close() 6");
36262967fb0SRobert Watson
36362967fb0SRobert Watson if (close(kq) == -1)
36462967fb0SRobert Watson fail(errno, "close", "kq", NULL);
36500e13b1dSNik Clayton OK("close() 7");
36662967fb0SRobert Watson
36762967fb0SRobert Watson return (0);
36862967fb0SRobert Watson }
369