svn commit: r294650 - in user/ngie/socket-tests: . etc/mtree tests/sys/kern tests/sys/kern/sockets tools/regression/sockets
Garrett Cooper
ngie at FreeBSD.org
Sun Jan 24 00:26:48 UTC 2016
Author: ngie
Date: Sun Jan 24 00:26:45 2016
New Revision: 294650
URL: https://svnweb.freebsd.org/changeset/base/294650
Log:
Checkpoint work (so far) to integrate tools/regression/sockets in to
the FreeBSD test suite under tests/sys/kern/sockets
Move some of the existing socket related tests from tests/sys/kern to
tests/sys/kern/sockets
Added:
user/ngie/socket-tests/tests/sys/kern/sockets/
user/ngie/socket-tests/tests/sys/kern/sockets/accept_fd_leak_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c
user/ngie/socket-tests/tests/sys/kern/sockets/accf_data_attach_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/accf_data_attach/accf_data_attach.c
user/ngie/socket-tests/tests/sys/kern/sockets/fstat_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/fstat/fstat.c
user/ngie/socket-tests/tests/sys/kern/sockets/kqueue_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/kqueue/kqueue.c
user/ngie/socket-tests/tests/sys/kern/sockets/listen_backlog_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/listen_backlog/listen_backlog.c
user/ngie/socket-tests/tests/sys/kern/sockets/listen_close_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/listenclose/listenclose.c
user/ngie/socket-tests/tests/sys/kern/sockets/pr_atomic_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/pr_atomic/pr_atomic.c
user/ngie/socket-tests/tests/sys/kern/sockets/reconnect_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/reconnect/reconnect.c
user/ngie/socket-tests/tests/sys/kern/sockets/rtsocket_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/rtsocket/rtsocket.c
user/ngie/socket-tests/tests/sys/kern/sockets/sblock_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/sblock/sblock.c
user/ngie/socket-tests/tests/sys/kern/sockets/sendfile_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/sendfile/sendfile.c
user/ngie/socket-tests/tests/sys/kern/sockets/shutdown_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/shutdown/shutdown.c
user/ngie/socket-tests/tests/sys/kern/sockets/sigpipe_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/sigpipe/sigpipe.c
user/ngie/socket-tests/tests/sys/kern/sockets/so_setfib_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/so_setfib/so_setfib.c
user/ngie/socket-tests/tests/sys/kern/sockets/socketpair_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/socketpair/socketpair.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_bindconnect_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_bindconnect/unix_bindconnect.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_close_race_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_close_race/unix_close_race.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_cmsg_test.sh
- copied, changed from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_cmsg/unix_cmsg.t
user/ngie/socket-tests/tests/sys/kern/sockets/unix_cmsg_test_helper.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_cmsg/unix_cmsg.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_gc_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_gc/unix_gc.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_passfd_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tests/sys/kern/unix_passfd_test.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_sendtorace_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_sendtorace/unix_sendtorace.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_seqpacket_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tests/sys/kern/unix_seqpacket_test.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_socket_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_socket/unix_socket.c
user/ngie/socket-tests/tests/sys/kern/sockets/unix_sorflush_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/unix_sorflush/unix_sorflush.c
user/ngie/socket-tests/tests/sys/kern/sockets/zerosend_test.c
- copied unchanged from r294649, user/ngie/socket-tests/tools/regression/sockets/zerosend/zerosend.c
Deleted:
user/ngie/socket-tests/tests/sys/kern/unix_passfd_test.c
user/ngie/socket-tests/tests/sys/kern/unix_seqpacket_test.c
user/ngie/socket-tests/tools/regression/sockets/
Modified:
user/ngie/socket-tests/ObsoleteFiles.inc
user/ngie/socket-tests/etc/mtree/BSD.tests.dist
user/ngie/socket-tests/tests/sys/kern/Makefile
Modified: user/ngie/socket-tests/ObsoleteFiles.inc
==============================================================================
--- user/ngie/socket-tests/ObsoleteFiles.inc Sat Jan 23 23:00:38 2016 (r294649)
+++ user/ngie/socket-tests/ObsoleteFiles.inc Sun Jan 24 00:26:45 2016 (r294650)
@@ -38,6 +38,8 @@
# xargs -n1 | sort | uniq -d;
# done
+OLD_FILES+=usr/tests/sys/kern/unix_passfd_test
+OLD_FILES+=usr/tests/sys/kern/unix_seqpacket_test
# 20160116: Update mandoc to cvs snapshot 20160116
OLD_FILES+=usr/share/mdocml/example.style.css
OLD_FILES+=usr/share/mdocml/style.css
Modified: user/ngie/socket-tests/etc/mtree/BSD.tests.dist
==============================================================================
--- user/ngie/socket-tests/etc/mtree/BSD.tests.dist Sat Jan 23 23:00:38 2016 (r294649)
+++ user/ngie/socket-tests/etc/mtree/BSD.tests.dist Sun Jan 24 00:26:45 2016 (r294650)
@@ -409,6 +409,8 @@
..
pipe
..
+ sockets
+ ..
..
kqueue
..
Modified: user/ngie/socket-tests/tests/sys/kern/Makefile
==============================================================================
--- user/ngie/socket-tests/tests/sys/kern/Makefile Sat Jan 23 23:00:38 2016 (r294649)
+++ user/ngie/socket-tests/tests/sys/kern/Makefile Sun Jan 24 00:26:45 2016 (r294650)
@@ -7,12 +7,8 @@ TESTSDIR= ${TESTSBASE}/sys/kern
ATF_TESTS_C+= kern_copyin
ATF_TESTS_C+= kern_descrip_test
ATF_TESTS_C+= ptrace_test
-ATF_TESTS_C+= unix_seqpacket_test
-ATF_TESTS_C+= unix_passfd_test
-TEST_METADATA.unix_seqpacket_test+= timeout="15"
LIBADD.ptrace_test+= pthread
-LIBADD.unix_seqpacket_test+= pthread
NETBSD_ATF_TESTS_C+= lockf_test
NETBSD_ATF_TESTS_C+= mqueue_test
@@ -25,6 +21,7 @@ WARNS?= 5
TESTS_SUBDIRS+= acct
TESTS_SUBDIRS+= execve
TESTS_SUBDIRS+= pipe
+TESTS_SUBDIRS+= sockets
.include <netbsd-tests.test.mk>
Copied: user/ngie/socket-tests/tests/sys/kern/sockets/accept_fd_leak_test.c (from r294649, user/ngie/socket-tests/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/ngie/socket-tests/tests/sys/kern/sockets/accept_fd_leak_test.c Sun Jan 24 00:26:45 2016 (r294650, copy of r294649, user/ngie/socket-tests/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c)
@@ -0,0 +1,215 @@
+/*-
+ * Copyright (c) 2004 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+
+#include <netinet/in.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define BIND_ATTEMPTS 10
+#define LOOPS 500
+#define NUM_ATTEMPTS 1000
+
+static volatile int quit;
+
+static void
+child_died(int sig __unused)
+{
+
+ quit = 1;
+}
+
+/*
+ * This test is intended to detect a leak of a file descriptor in the process
+ * following a failed non-blocking accept. It measures an available fd
+ * baseline, then performs 1000 failing accepts, then checks to see what the
+ * next fd is. It relies on sequential fd allocation, and will test for it
+ * briefly before beginning (not 100% reliable, but a good start).
+ */
+int
+main(void)
+{
+ struct sockaddr_in sin;
+ socklen_t size;
+ pid_t child;
+ int fd1, fd2, fd3, i, listen_port, s, status;
+
+ printf("1..2\n");
+
+ /*
+ * Check for sequential fd allocation, and give up early if not.
+ */
+ fd1 = dup(STDIN_FILENO);
+ fd2 = dup(STDIN_FILENO);
+ if (fd2 != fd1 + 1)
+ errx(-1, "Non-sequential fd allocation\n");
+
+ s = socket(PF_INET, SOCK_STREAM, 0);
+ if (s == -1)
+ errx(-1, "socket: %s", strerror(errno));
+
+ bzero(&sin, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ srandomdev();
+
+ for (i = 0; i < BIND_ATTEMPTS; i++) {
+ /* Pick a random unprivileged port 1025-65535 */
+ listen_port = MAX((int)random() % 65535, 1025);
+ sin.sin_port = htons(listen_port);
+ if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == 0)
+ break;
+ warn("bind with %d failed", listen_port);
+ usleep(1000);
+ }
+ if (i >= BIND_ATTEMPTS) {
+ printf("Bail out!\n");
+ exit(1);
+ }
+
+ if (listen(s, -1) != 0)
+ errx(-1, "listen: %s", strerror(errno));
+
+ i = fcntl(s, F_GETFL);
+ if (i == -1)
+ errx(-1, "ioctl(F_GETFL): %s", strerror(errno));
+ i |= O_NONBLOCK;
+ if (fcntl(s, F_SETFL, i) != 0)
+ errx(-1, "ioctl(F_SETFL): %s", strerror(errno));
+ i = fcntl(s, F_GETFL);
+ if (i == -1)
+ errx(-1, "ioctl(F_GETFL): %s", strerror(errno));
+ if ((i & O_NONBLOCK) != O_NONBLOCK)
+ errx(-1, "Failed to set O_NONBLOCK (i=0x%x)\n", i);
+
+ for (i = 0; i < LOOPS; i++) {
+ size = sizeof(sin);
+ if (accept(s, (struct sockaddr *)&sin, &size) != -1)
+ errx(-1, "accept succeeded\n");
+ if (errno != EAGAIN)
+ errx(-1, "accept: %s", strerror(errno));
+ }
+
+ /*
+ * Allocate a file descriptor and make sure it's fd2+2. 2 because
+ * we allocate an fd for the socket.
+ */
+ fd3 = dup(STDIN_FILENO);
+ if (fd3 != fd2 + 2)
+ printf("not ok 1 - (%d, %d, %d)\n", fd1, fd2, fd3);
+ else
+ printf("ok 1\n");
+
+ /*
+ * Try failing accept's w/o non-blocking where the destination
+ * address pointer is invalid.
+ */
+ close(fd3);
+ signal(SIGCHLD, child_died);
+ child = fork();
+ if (child < 0)
+ errx(-1, "fork: %s", strerror(errno));
+
+ /*
+ * Child process does `NUM_ATTEMPTS` connects.
+ */
+ if (child == 0) {
+ close(fd1);
+ close(fd2);
+ close(s);
+
+ bzero(&sin, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ sin.sin_port = htons(listen_port);
+
+ for (i = 0; i < NUM_ATTEMPTS; i++) {
+ s = socket(PF_INET, SOCK_STREAM, 0);
+ if (s == -1)
+ errx(-1, "socket: %s", strerror(errno));
+ if (connect(s, (struct sockaddr *)&sin,
+ sizeof(sin)) < 0)
+ errx(-1, "connect: %s", strerror(errno));
+ close(s);
+ }
+ _exit(0);
+ }
+
+ /* Reset back to a blocking socket. */
+ i = fcntl(s, F_GETFL);
+ if (i == -1)
+ errx(-1, "ioctl(F_GETFL): %s", strerror(errno));
+ i &= ~O_NONBLOCK;
+ if (fcntl(s, F_SETFL, i) != 0)
+ errx(-1, "ioctl(F_SETFL): %s", strerror(errno));
+ i = fcntl(s, F_GETFL);
+ if (i == -1)
+ errx(-1, "ioctl(F_GETFL): %s", strerror(errno));
+ if (i & O_NONBLOCK)
+ errx(-1, "Failed to clear O_NONBLOCK (i=0x%x)\n", i);
+
+ /* Do `NUM_ATTEMPTS` accepts with an invalid pointer. */
+ for (i = 0; !quit && i < NUM_ATTEMPTS; i++) {
+ size = sizeof(sin);
+ if (accept(s, (struct sockaddr *)(uintptr_t)(0x100),
+ &size) != -1)
+ errx(-1, "accept succeeded\n");
+ if (errno != EFAULT)
+ errx(-1, "accept: %s", strerror(errno));
+ }
+
+ if (waitpid(child, &status, 0) < 0)
+ errx(-1, "waitpid: %s", strerror(errno));
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ warnx("child process died");
+
+ /*
+ * Allocate a file descriptor and make sure it's fd2+2. 2 because
+ * we allocate an fd for the socket.
+ */
+ fd3 = dup(STDIN_FILENO);
+ if (fd3 != fd2 + 2)
+ printf("not ok 2 - (%d, %d, %d)\n", fd1, fd2, fd3);
+ else
+ printf("ok 2\n");
+
+ return (0);
+}
Copied: user/ngie/socket-tests/tests/sys/kern/sockets/accf_data_attach_test.c (from r294649, user/ngie/socket-tests/tools/regression/sockets/accf_data_attach/accf_data_attach.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/ngie/socket-tests/tests/sys/kern/sockets/accf_data_attach_test.c Sun Jan 24 00:26:45 2016 (r294650, copy of r294649, user/ngie/socket-tests/tools/regression/sockets/accf_data_attach/accf_data_attach.c)
@@ -0,0 +1,227 @@
+/*-
+ * Copyright (c) 2004 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/module.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define ACCF_NAME "dataready"
+
+/*
+ * A number of small tests to confirm that attaching ACCF_DATA accept filters
+ * to inet4 ports works as expected. We test:
+ *
+ * - That no accept filter is attached on a newly created socket.
+ * - That bind() has no affect on the accept filter state.
+ * - That we can't attach an accept filter to a socket that isn't in the
+ * listen state.
+ * - That after we fail to attach the filter, querying the kernel shows no
+ * filter attached.
+ * - That we can attach an accept filter to a socket that is in the listen
+ * state.
+ * - That once an accept filter is attached, we can query to make sure it is
+ * attached.
+ * - That once an accept filter is attached, we can remove it and query to
+ * make sure it is removed.
+ */
+int
+main(void)
+{
+ struct accept_filter_arg afa;
+ struct sockaddr_in sin;
+ socklen_t len;
+ int lso, ret;
+
+ /* XXX: PLAIN_TEST_REQUIRE_MODULE "backport" for stable/9 */
+ const char *_mod_name = "accf_data";
+
+ if (modfind(_mod_name) == -1) {
+ printf("1..0 # SKIP - module %s could not be resolved: %s\n",
+ _mod_name, strerror(errno));
+ _exit(0);
+ }
+ /* XXX: PLAIN_TEST_REQUIRE_MODULE for stable/9 */
+
+ printf("1..11\n");
+
+ /*
+ * Step 0. Open socket().
+ */
+ lso = socket(PF_INET, SOCK_STREAM, 0);
+ if (lso == -1)
+ errx(-1, "not ok 1 - socket: %s", strerror(errno));
+ printf("ok 1 - socket\n");
+
+ /*
+ * Step 1. After socket(). Should return EINVAL, since no accept
+ * filter should be attached.
+ */
+ bzero(&afa, sizeof(afa));
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret != -1)
+ errx(-1, "not ok 2 - getsockopt() after socket() succeeded");
+ if (errno != EINVAL)
+ errx(-1, "not ok 2 - getsockopt() after socket() failed with "
+ "%d (%s)", errno, strerror(errno));
+ printf("ok 2 - getsockopt\n");
+
+ /*
+ * Step 2. Bind(). Ideally this will succeed.
+ */
+ bzero(&sin, sizeof(sin));
+ sin.sin_len = sizeof(sin);
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(8080);
+ sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ if (bind(lso, (struct sockaddr *)&sin, sizeof(sin)) < 0)
+ errx(-1, "not ok 3 - bind %s", strerror(errno));
+ printf("ok 3 - bind\n");
+
+ /*
+ * Step 3: After bind(). getsockopt() should return EINVAL, since no
+ * accept filter should be attached.
+ */
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret != -1)
+ errx(-1, "not ok 4 - getsockopt() after bind() succeeded");
+ if (errno != EINVAL)
+ errx(-1, "not ok 4 - getsockopt() after bind() failed with %d (%s)",
+ errno, strerror(errno));
+ printf("ok 4 - getsockopt\n");
+
+ /*
+ * Step 4: Setsockopt() before listen(). Should fail, since it's not
+ * yet a listen() socket.
+ */
+ bzero(&afa, sizeof(afa));
+ strncpy(afa.af_name, ACCF_NAME, sizeof(afa.af_name));
+ ret = setsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa));
+ if (ret == 0)
+ errx(-1, "not ok 5 - setsockopt() before listen() succeeded");
+ printf("ok 5 - setsockopt\n");
+
+ /*
+ * Step 5: Getsockopt() after pre-listen() setsockopt(). Should
+ * fail with EINVAL, since setsockopt() should have failed.
+ */
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret == 0)
+ errx(-1, "not ok 6 - getsockopt() after pre-listen() setsockopt() "
+ "succeeded");
+ if (errno != EINVAL)
+ errx(-1, "not ok 6 - pre-listen() getsockopt() failed with %d (%s)",
+ errno, strerror(errno));
+ printf("ok 6 - getsockopt\n");
+
+ /*
+ * Step 6: listen().
+ */
+ if (listen(lso, -1) < 0)
+ errx(-1, "not ok 7 - listen: %s", strerror(errno));
+ printf("ok 7 - listen\n");
+
+ /*
+ * Step 7: Getsockopt() after listen(). Should fail with EINVAL,
+ * since we have not installed accept filter yet.
+ */
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret == 0)
+ errx(-1, "not ok 8 - getsockopt() after listen() but before "
+ "setsockopt() succeeded");
+ if (errno != EINVAL)
+ errx(-1, "not ok 8 - getsockopt() after listen() but before "
+ "setsockopt() failed with %d (%s)", errno, strerror(errno));
+ printf("ok 8 - getsockopt\n");
+
+ /*
+ * Step 8: After listen(). This call to setsockopt() should succeed.
+ */
+ bzero(&afa, sizeof(afa));
+ strncpy(afa.af_name, ACCF_NAME, sizeof(afa.af_name));
+ ret = setsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa));
+ if (ret != 0)
+ errx(-1, "not ok 9 - setsockopt() after listen() failed with %d "
+ "(%s)", errno, strerror(errno));
+ printf("ok 9 - setsockopt\n");
+
+ /*
+ * Step 9: After setsockopt(). Should succeed and identify
+ * ACCF_NAME.
+ */
+ bzero(&afa, sizeof(afa));
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret != 0)
+ errx(-1, "not ok 10 - getsockopt() after listen() setsockopt() "
+ "failed with %d (%s)", errno, strerror(errno));
+ if (len != sizeof(afa))
+ errx(-1, "not ok 10 - getsockopt() after setsockopet() after "
+ "listen() returned wrong size (got %d expected %zd)", len,
+ sizeof(afa));
+ if (strcmp(afa.af_name, ACCF_NAME) != 0)
+ errx(-1, "not ok 10 - getsockopt() after setsockopt() after "
+ "listen() mismatch (got %s expected %s)", afa.af_name,
+ ACCF_NAME);
+ printf("ok 10 - getsockopt\n");
+
+ /*
+ * Step 10: Remove accept filter. After removing the accept filter
+ * getsockopt() should fail with EINVAL.
+ */
+ ret = setsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0);
+ if (ret != 0)
+ errx(-1, "not ok 11 - setsockopt() after listen() "
+ "failed with %d (%s)", errno, strerror(errno));
+ bzero(&afa, sizeof(afa));
+ len = sizeof(afa);
+ ret = getsockopt(lso, SOL_SOCKET, SO_ACCEPTFILTER, &afa, &len);
+ if (ret == 0)
+ errx(-1, "not ok 11 - getsockopt() after removing "
+ "the accept filter returns valid accept filter %s",
+ afa.af_name);
+ if (errno != EINVAL)
+ errx(-1, "not ok 11 - getsockopt() after removing the accept"
+ "filter failed with %d (%s)", errno, strerror(errno));
+ printf("ok 11 - setsockopt\n");
+
+ close(lso);
+ return (0);
+}
Copied: user/ngie/socket-tests/tests/sys/kern/sockets/fstat_test.c (from r294649, user/ngie/socket-tests/tools/regression/sockets/fstat/fstat.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/ngie/socket-tests/tests/sys/kern/sockets/fstat_test.c Sun Jan 24 00:26:45 2016 (r294650, copy of r294649, user/ngie/socket-tests/tools/regression/sockets/fstat/fstat.c)
@@ -0,0 +1,71 @@
+/*-
+ * Copyright (c) 2008 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <unistd.h>
+
+/*
+ * Basic test to make sure that fstat(2) returns success on various socket
+ * types. In the future we should also validate the fields, confirming
+ * expected results such as the effect of shutdown(2) on permissions, etc.
+ */
+
+static void
+dotest(int domain, int type, int protocol)
+{
+ struct stat sb;
+ int sock;
+
+ sock = socket(domain, type, protocol);
+ if (sock < 0)
+ err(-1, "socket(%d, %d, %d)", domain, type, protocol);
+
+ if (fstat(sock, &sb) < 0)
+ err(-1, "fstat on socket(%d, %d, %d)", domain, type,
+ protocol);
+
+ close(sock);
+}
+
+int
+main(void)
+{
+
+ dotest(PF_INET, SOCK_DGRAM, 0);
+ dotest(PF_INET, SOCK_STREAM, 0);
+ dotest(PF_INET6, SOCK_DGRAM, 0);
+ dotest(PF_INET6, SOCK_STREAM, 0);
+ dotest(PF_LOCAL, SOCK_DGRAM, 0);
+ dotest(PF_LOCAL, SOCK_STREAM, 0);
+
+ return (0);
+}
Copied: user/ngie/socket-tests/tests/sys/kern/sockets/kqueue_test.c (from r294649, user/ngie/socket-tests/tools/regression/sockets/kqueue/kqueue.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/ngie/socket-tests/tests/sys/kern/sockets/kqueue_test.c Sun Jan 24 00:26:45 2016 (r294650, copy of r294649, user/ngie/socket-tests/tools/regression/sockets/kqueue/kqueue.c)
@@ -0,0 +1,368 @@
+/*-
+ * Copyright (c) 2004 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static int curtest = 1;
+
+/*-
+ * This test uses UNIX domain socket pairs to perform some basic exercising
+ * of kqueue functionality on sockets. In particular, testing that for read
+ * and write filters, we see the correct detection of whether reads and
+ * writes should actually be able to occur.
+ *
+ * TODO:
+ * - Test read/write filters for listen/accept sockets.
+ * - Handle the XXXRW below regarding datagram sockets.
+ * - Test that watermark/buffer size "data" fields returned by kqueue are
+ * correct.
+ * - Check that kqueue does something sensible when the remote endpoing is
+ * closed.
+ */
+
+#define OK(testname) printf("ok %d - %s\n", curtest, testname); \
+ curtest++;
+
+static void
+fail(int error, const char *func, const char *socktype, const char *rest)
+{
+
+ printf("not ok %d\n", curtest);
+
+ if (socktype == NULL)
+ printf("# %s(): %s\n", func, strerror(error));
+ else if (rest == NULL)
+ printf("# %s(%s): %s\n", func, socktype,
+ strerror(error));
+ else
+ printf("# %s(%s, %s): %s\n", func, socktype, rest,
+ strerror(error));
+ exit(-1);
+}
+
+static void
+fail_assertion(const char *func, const char *socktype, const char *rest,
+ const char *assertion)
+{
+
+ printf("not ok %d - %s\n", curtest, assertion);
+
+ if (socktype == NULL)
+ printf("# %s(): assertion %s failed\n", func,
+ assertion);
+ else if (rest == NULL)
+ printf("# %s(%s): assertion %s failed\n", func,
+ socktype, assertion);
+ else
+ printf("# %s(%s, %s): assertion %s failed\n", func,
+ socktype, rest, assertion);
+ exit(-1);
+}
+
+/*
+ * Test read kevent on a socket pair: check to make sure endpoint 0 isn't
+ * readable when we start, then write to endpoint 1 and confirm that endpoint
+ * 0 is now readable. Drain the write, then check that it's not readable
+ * again. Use non-blocking kqueue operations and socket operations.
+ */
+static void
+test_evfilt_read(int kq, int fd[2], const char *socktype)
+{
+ struct timespec ts;
+ struct kevent ke;
+ ssize_t len;
+ char ch;
+ int i;
+
+ EV_SET(&ke, fd[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
+ if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
+ fail(errno, "kevent", socktype, "EVFILT_READ, EV_ADD");
+ OK("EVFILT_READ, EV_ADD");
+
+ /*
+ * Confirm not readable to begin with, no I/O yet.
+ */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ i = kevent(kq, NULL, 0, &ke, 1, &ts);
+ if (i == -1)
+ fail(errno, "kevent", socktype, "EVFILT_READ");
+ OK("EVFILT_READ");
+ if (i != 0)
+ fail_assertion("kevent", socktype, "EVFILT_READ",
+ "empty socket unreadable");
+ OK("empty socket unreadable");
+
+ /*
+ * Write a byte to one end.
+ */
+ ch = 'a';
+ len = write(fd[1], &ch, sizeof(ch));
+ if (len == -1)
+ fail(errno, "write", socktype, NULL);
+ OK("write one byte");
+ if (len != sizeof(ch))
+ fail_assertion("write", socktype, NULL, "write length");
+ OK("write one byte length");
+
+ /*
+ * Other end should now be readable.
+ */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ i = kevent(kq, NULL, 0, &ke, 1, &ts);
+ if (i == -1)
+ fail(errno, "kevent", socktype, "EVFILT_READ");
+ OK("EVFILT_READ");
+ if (i != 1)
+ fail_assertion("kevent", socktype, "EVFILT_READ",
+ "non-empty socket unreadable");
+ OK("non-empty socket unreadable");
+
+ /*
+ * Read a byte to clear the readable state.
+ */
+ len = read(fd[0], &ch, sizeof(ch));
+ if (len == -1)
+ fail(errno, "read", socktype, NULL);
+ OK("read one byte");
+ if (len != sizeof(ch))
+ fail_assertion("read", socktype, NULL, "read length");
+ OK("read one byte length");
+
+ /*
+ * Now re-check for readability.
+ */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ i = kevent(kq, NULL, 0, &ke, 1, &ts);
+ if (i == -1)
+ fail(errno, "kevent", socktype, "EVFILT_READ");
+ OK("EVFILT_READ");
+ if (i != 0)
+ fail_assertion("kevent", socktype, "EVFILT_READ",
+ "empty socket unreadable");
+ OK("empty socket unreadable");
+
+ EV_SET(&ke, fd[0], EVFILT_READ, EV_DELETE, 0, 0, NULL);
+ if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
+ fail(errno, "kevent", socktype, "EVFILT_READ, EV_DELETE");
+ OK("EVFILT_READ, EV_DELETE");
+}
+
+static void
+test_evfilt_write(int kq, int fd[2], const char *socktype)
+{
+ struct timespec ts;
+ struct kevent ke;
+ ssize_t len;
+ char ch;
+ int i;
+
+ EV_SET(&ke, fd[0], EVFILT_WRITE, EV_ADD, 0, 0, NULL);
+ if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
+ fail(errno, "kevent", socktype, "EVFILT_WRITE, EV_ADD");
+ OK("EVFILE_WRITE, EV_ADD");
+
+ /*
+ * Confirm writable to begin with, no I/O yet.
+ */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ i = kevent(kq, NULL, 0, &ke, 1, &ts);
+ if (i == -1)
+ fail(errno, "kevent", socktype, "EVFILT_WRITE");
+ OK("EVFILE_WRITE");
+ if (i != 1)
+ fail_assertion("kevent", socktype, "EVFILT_WRITE",
+ "empty socket unwritable");
+ OK("empty socket unwritable");
+
+ /*
+ * Write bytes into the socket until we can't write anymore.
+ */
+ ch = 'a';
+ while ((len = write(fd[0], &ch, sizeof(ch))) == sizeof(ch)) {};
+ if (len == -1 && errno != EAGAIN && errno != ENOBUFS)
+ fail(errno, "write", socktype, NULL);
+ OK("write");
+ if (len != -1 && len != sizeof(ch))
+ fail_assertion("write", socktype, NULL, "write length");
+ OK("write length");
+
+ /*
+ * Check to make sure the socket is no longer writable.
+ */
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+ i = kevent(kq, NULL, 0, &ke, 1, &ts);
+ if (i == -1)
+ fail(errno, "kevent", socktype, "EVFILT_WRITE");
+ OK("EVFILT_WRITE");
+ if (i != 0)
+ fail_assertion("kevent", socktype, "EVFILT_WRITE",
+ "full socket writable");
+ OK("full socket writable");
+
+ EV_SET(&ke, fd[0], EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
+ if (kevent(kq, &ke, 1, NULL, 0, NULL) == -1)
+ fail(errno, "kevent", socktype, "EVFILT_WRITE, EV_DELETE");
+ OK("EVFILT_WRITE, EV_DELETE");
+}
+
+/*
+ * Basic registration exercise for kqueue(2). Create several types/brands of
+ * sockets, and confirm that we can register for various events on them.
+ */
+int
+main(void)
+{
+ int kq, sv[2];
+
+ printf("1..49\n");
+
+ kq = kqueue();
+ if (kq == -1)
+ fail(errno, "kqueue", NULL, NULL);
+ OK("kqueue()");
+
+ /*
+ * Create a UNIX domain datagram socket, and attach/test/detach a
+ * read filter on it.
+ */
+ if (socketpair(PF_UNIX, SOCK_DGRAM, 0, sv) == -1)
+ fail(errno, "socketpair", "PF_UNIX, SOCK_DGRAM", NULL);
+ OK("socketpair() 1");
+
+ if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
+ OK("fcntl() 1");
+ if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
+ OK("fnctl() 2");
+
+ test_evfilt_read(kq, sv, "PF_UNIX, SOCK_DGRAM");
+
+ if (close(sv[0]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[0]");
+ OK("close() 1");
+ if (close(sv[1]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[1]");
+ OK("close() 2");
+
+#if 0
+ /*
+ * XXXRW: We disable the write test in the case of datagram sockets,
+ * as kqueue can't tell when the remote socket receive buffer is
+ * full, whereas the UNIX domain socket implementation can tell and
+ * returns ENOBUFS.
+ */
+ /*
+ * Create a UNIX domain datagram socket, and attach/test/detach a
+ * write filter on it.
+ */
+ if (socketpair(PF_UNIX, SOCK_DGRAM, 0, sv) == -1)
+ fail(errno, "socketpair", "PF_UNIX, SOCK_DGRAM", NULL);
+
+ if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
+ if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_DGRAM", "O_NONBLOCK");
+
+ test_evfilt_write(kq, sv, "PF_UNIX, SOCK_DGRAM");
+
+ if (close(sv[0]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[0]");
+ if (close(sv[1]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_DGRAM", "sv[1]");
+#endif
+
+ /*
+ * Create a UNIX domain stream socket, and attach/test/detach a
+ * read filter on it.
+ */
+ if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
+ fail(errno, "socketpair", "PF_UNIX, SOCK_STREAM", NULL);
+ OK("socketpair() 2");
+
+ if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
+ OK("fcntl() 3");
+ if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
+ OK("fcntl() 4");
+
+ test_evfilt_read(kq, sv, "PF_UNIX, SOCK_STREAM");
+
+ if (close(sv[0]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[0]");
+ OK("close() 3");
+ if (close(sv[1]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[1]");
+ OK("close() 4");
+
+ /*
+ * Create a UNIX domain stream socket, and attach/test/detach a
+ * write filter on it.
+ */
+ if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1)
+ fail(errno, "socketpair", "PF_UNIX, SOCK_STREAM", NULL);
+ OK("socketpair() 3");
+
+ if (fcntl(sv[0], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
+ OK("fcntl() 5");
+ if (fcntl(sv[1], F_SETFL, O_NONBLOCK) != 0)
+ fail(errno, "fcntl", "PF_UNIX, SOCK_STREAM", "O_NONBLOCK");
+ OK("fcntl() 6");
+
+ test_evfilt_write(kq, sv, "PF_UNIX, SOCK_STREAM");
+
+ if (close(sv[0]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[0]");
+ OK("close() 5");
+ if (close(sv[1]) == -1)
+ fail(errno, "close", "PF_UNIX/SOCK_STREAM", "sv[1]");
+ OK("close() 6");
+
+ if (close(kq) == -1)
+ fail(errno, "close", "kq", NULL);
+ OK("close() 7");
+
+ return (0);
+}
Copied: user/ngie/socket-tests/tests/sys/kern/sockets/listen_backlog_test.c (from r294649, user/ngie/socket-tests/tools/regression/sockets/listen_backlog/listen_backlog.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/ngie/socket-tests/tests/sys/kern/sockets/listen_backlog_test.c Sun Jan 24 00:26:45 2016 (r294650, copy of r294649, user/ngie/socket-tests/tools/regression/sockets/listen_backlog/listen_backlog.c)
@@ -0,0 +1,383 @@
+/*-
+ * Copyright (c) 2005 Robert N. M. Watson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+
+#include <err.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/*
+ * This regression test is intended to validate that the backlog parameter
+ * set by listen() is properly set, can be retrieved using SO_LISTENQLIMIT,
+ * and that it can be updated by later calls to listen(). We also check that
+ * SO_LISTENQLIMIT cannot be set.
+ *
+ * Future things to test:
+ *
+ * - That if we change the value of kern.ipc.somaxconn, the limits really
+ * do change.
+ *
+ * - That limits are, approximately, enforced and implemented.
+ *
+ * - All this on multiple socket types -- i.e., PF_LOCAL.
+ *
+ * - That we also test SO_LISTENQLEN and SO_LISTENINCQLEN.
+ */
+
+/*
+ * We retrieve kern.ipc.somaxconn before running the tests in order to use a
+ * run-time set value of SOMAXCONN, rather than compile-time set. We assume
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-user
mailing list