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