Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Oct 2018 17:26:41 +0000 (UTC)
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r339066 - stable/11/tools/regression/sockets/unix_cmsg
Message-ID:  <201810011726.w91HQfG5069159@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sobomax
Date: Mon Oct  1 17:26:41 2018
New Revision: 339066
URL: https://svnweb.freebsd.org/changeset/base/339066

Log:
  MFC r309554 and r309631 which breaks down overly long monolithic
  souce file and reduces duplication by auto-generating functions
  that only differ in the value of the SCM_XXX constant used.
  
  This also fixes unintentional breakage introduced in earlier
  MFC in r338617 that happens to rely on some of those changes.
  
  Reported by:	asomers
  Pointy-hat goes to:	sobomax

Added:
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c
  stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h
  stable/11/tools/regression/sockets/unix_cmsg/t_generic.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c
  stable/11/tools/regression/sockets/unix_cmsg/t_generic.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h
  stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c
  stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h
  stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c
  stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.h
  stable/11/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
     - copied unchanged from r309631, head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
  stable/11/tools/regression/sockets/unix_cmsg/t_xxxtime.h.in
     - copied unchanged from r309631, head/tools/regression/sockets/unix_cmsg/t_xxxtime.h.in
  stable/11/tools/regression/sockets/unix_cmsg/uc_common.c
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/uc_common.c
  stable/11/tools/regression/sockets/unix_cmsg/uc_common.h
     - copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/uc_common.h
Modified:
  stable/11/tools/regression/sockets/unix_cmsg/Makefile
  stable/11/tools/regression/sockets/unix_cmsg/unix_cmsg.c

Modified: stable/11/tools/regression/sockets/unix_cmsg/Makefile
==============================================================================
--- stable/11/tools/regression/sockets/unix_cmsg/Makefile	Mon Oct  1 16:23:00 2018	(r339065)
+++ stable/11/tools/regression/sockets/unix_cmsg/Makefile	Mon Oct  1 17:26:41 2018	(r339066)
@@ -1,6 +1,11 @@
 # $FreeBSD$
 
 PROG=	unix_cmsg
+SRCS=	${AUTOSRCS} unix_cmsg.c uc_common.h uc_common.c \
+	t_generic.h t_generic.c t_peercred.h t_peercred.c \
+	t_cmsgcred.h t_cmsgcred.c t_sockcred.h t_sockcred.c \
+	t_cmsgcred_sockcred.h t_cmsgcred_sockcred.c t_cmsg_len.h t_cmsg_len.c
+CLEANFILES+=	${AUTOSRCS}
 MAN=
 WARNS?=	3
 

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c)
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsg_len.h"
+
+#ifndef __LP64__
+static int
+t_cmsg_len_client(int fd)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	struct cmsghdr *cmsghdr;
+	void *cmsg_data;
+	size_t size, cmsg_size;
+	socklen_t socklen;
+	int rv;
+
+	if (uc_sync_recv() < 0)
+		return (-2);
+
+	rv = -2;
+
+	cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+	cmsg_data = malloc(cmsg_size);
+	if (cmsg_data == NULL) {
+		uc_logmsg("malloc");
+		goto done;
+	}
+	uc_msghdr_init_client(&msghdr, iov, cmsg_data, cmsg_size,
+	    SCM_CREDS, sizeof(struct cmsgcred));
+	cmsghdr = CMSG_FIRSTHDR(&msghdr);
+
+	if (uc_socket_connect(fd) < 0)
+		goto done;
+
+	size = msghdr.msg_iov != NULL ? msghdr.msg_iov->iov_len : 0;
+	rv = -1;
+	for (socklen = 0; socklen < CMSG_LEN(0); ++socklen) {
+		cmsghdr->cmsg_len = socklen;
+		uc_dbgmsg("send: data size %zu", size);
+		uc_dbgmsg("send: msghdr.msg_controllen %u",
+		    (u_int)msghdr.msg_controllen);
+		uc_dbgmsg("send: cmsghdr.cmsg_len %u",
+		    (u_int)cmsghdr->cmsg_len);
+		if (sendmsg(fd, &msghdr, 0) < 0) {
+			uc_dbgmsg("sendmsg(2) failed: %s; retrying",
+			    strerror(errno));
+			continue;
+		}
+		uc_logmsgx("sent message with cmsghdr.cmsg_len %u < %u",
+		    (u_int)cmsghdr->cmsg_len, (u_int)CMSG_LEN(0));
+		break;
+	}
+	if (socklen == CMSG_LEN(0))
+		rv = 0;
+
+	if (uc_sync_send() < 0) {
+		rv = -2;
+		goto done;
+	}
+done:
+	free(cmsg_data);
+	return (rv);
+}
+
+static int
+t_cmsg_len_server(int fd1)
+{
+	int fd2, rv;
+
+	if (uc_sync_send() < 0)
+		return (-2);
+
+	rv = -2;
+
+	if (uc_cfg.sock_type == SOCK_STREAM) {
+		fd2 = uc_socket_accept(fd1);
+		if (fd2 < 0)
+			goto done;
+	} else
+		fd2 = fd1;
+
+	if (uc_sync_recv() < 0)
+		goto done;
+
+	rv = 0;
+done:
+	if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+		if (uc_socket_close(fd2) < 0)
+			rv = -2;
+	return (rv);
+}
+
+int
+t_cmsg_len(void)
+{
+	return (t_generic(t_cmsg_len_client, t_cmsg_len_server));
+}
+#endif

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h)
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax@FreeBSD.org>
+ * 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$
+ */
+
+#ifndef __LP64__
+int t_cmsg_len(void);
+#endif

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c)
@@ -0,0 +1,139 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsgcred.h"
+
+int
+t_cmsgcred_client(int fd)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	void *cmsg_data;
+	size_t cmsg_size;
+	int rv;
+
+	if (uc_sync_recv() < 0)
+		return (-2);
+
+	rv = -2;
+
+	cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+	cmsg_data = malloc(cmsg_size);
+	if (cmsg_data == NULL) {
+		uc_logmsg("malloc");
+		goto done;
+	}
+	uc_msghdr_init_client(&msghdr, iov, cmsg_data, cmsg_size,
+	    SCM_CREDS, sizeof(struct cmsgcred));
+
+	if (uc_socket_connect(fd) < 0)
+		goto done;
+
+	if (uc_message_sendn(fd, &msghdr) < 0)
+		goto done;
+
+	rv = 0;
+done:
+	free(cmsg_data);
+	return (rv);
+}
+
+static int
+t_cmsgcred_server(int fd1)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	struct cmsghdr *cmsghdr;
+	void *cmsg_data;
+	size_t cmsg_size;
+	u_int i;
+	int fd2, rv;
+
+	if (uc_sync_send() < 0)
+		return (-2);
+
+	fd2 = -1;
+	rv = -2;
+
+	cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+	cmsg_data = malloc(cmsg_size);
+	if (cmsg_data == NULL) {
+		uc_logmsg("malloc");
+		goto done;
+	}
+
+	if (uc_cfg.sock_type == SOCK_STREAM) {
+		fd2 = uc_socket_accept(fd1);
+		if (fd2 < 0)
+			goto done;
+	} else
+		fd2 = fd1;
+
+	rv = -1;
+	for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+		uc_dbgmsg("message #%u", i);
+
+		uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+		if (uc_message_recv(fd2, &msghdr) < 0) {
+			rv = -2;
+			break;
+		}
+
+		if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+			break;
+
+		cmsghdr = CMSG_FIRSTHDR(&msghdr);
+		if (uc_check_scm_creds_cmsgcred(cmsghdr) < 0)
+			break;
+	}
+	if (i > uc_cfg.ipc_msg.msg_num)
+		rv = 0;
+done:
+	free(cmsg_data);
+	if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+		if (uc_socket_close(fd2) < 0)
+			rv = -2;
+	return (rv);
+}
+
+int
+t_cmsgcred(void)
+{
+	return (t_generic(t_cmsgcred_client, t_cmsgcred_server));
+}

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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$
+ */
+
+int t_cmsgcred_client(int fd);
+int t_cmsgcred(void);

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c)
@@ -0,0 +1,125 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsgcred.h"
+#include "t_cmsgcred_sockcred.h"
+
+static int
+t_cmsgcred_sockcred_server(int fd1)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	struct cmsghdr *cmsghdr;
+	void *cmsg_data, *cmsg1_data, *cmsg2_data;
+	size_t cmsg_size, cmsg1_size, cmsg2_size;
+	u_int i;
+	int fd2, rv, val;
+
+	fd2 = -1;
+	rv = -2;
+
+	cmsg1_size = CMSG_SPACE(SOCKCREDSIZE(uc_cfg.proc_cred.gid_num));
+	cmsg2_size = CMSG_SPACE(sizeof(struct cmsgcred));
+	cmsg1_data = malloc(cmsg1_size);
+	cmsg2_data = malloc(cmsg2_size);
+	if (cmsg1_data == NULL || cmsg2_data == NULL) {
+		uc_logmsg("malloc");
+		goto done;
+	}
+
+	uc_dbgmsg("setting LOCAL_CREDS");
+	val = 1;
+	if (setsockopt(fd1, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+		uc_logmsg("setsockopt(LOCAL_CREDS)");
+		goto done;
+	}
+
+	if (uc_sync_send() < 0)
+		goto done;
+
+	if (uc_cfg.sock_type == SOCK_STREAM) {
+		fd2 = uc_socket_accept(fd1);
+		if (fd2 < 0)
+			goto done;
+	} else
+		fd2 = fd1;
+
+	cmsg_data = cmsg1_data;
+	cmsg_size = cmsg1_size;
+	rv = -1;
+	for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+		uc_dbgmsg("message #%u", i);
+
+		uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+		if (uc_message_recv(fd2, &msghdr) < 0) {
+			rv = -2;
+			break;
+		}
+
+		if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+			break;
+
+		cmsghdr = CMSG_FIRSTHDR(&msghdr);
+		if (i == 1 || uc_cfg.sock_type == SOCK_DGRAM) {
+			if (uc_check_scm_creds_sockcred(cmsghdr) < 0)
+				break;
+		} else {
+			if (uc_check_scm_creds_cmsgcred(cmsghdr) < 0)
+				break;
+		}
+
+		cmsg_data = cmsg2_data;
+		cmsg_size = cmsg2_size;
+	}
+	if (i > uc_cfg.ipc_msg.msg_num)
+		rv = 0;
+done:
+	free(cmsg1_data);
+	free(cmsg2_data);
+	if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+		if (uc_socket_close(fd2) < 0)
+			rv = -2;
+	return (rv);
+}
+
+int
+t_cmsgcred_sockcred(void)
+{
+	return (t_generic(t_cmsgcred_client, t_cmsgcred_sockcred_server));
+}

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax@FreeBSD.org>
+ * 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$
+ */
+
+int t_cmsgcred_sockcred(void);

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_generic.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_generic.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c)
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+
+int
+t_generic(int (*client_func)(int), int (*server_func)(int))
+{
+	int fd, rv, rv_client;
+
+	switch (uc_client_fork()) {
+	case 0:
+		fd = uc_socket_create();
+		if (fd < 0)
+			rv = -2;
+		else {
+			rv = client_func(fd);
+			if (uc_socket_close(fd) < 0)
+				rv = -2;
+		}
+		uc_client_exit(rv);
+		break;
+	case 1:
+		fd = uc_socket_create();
+		if (fd < 0)
+			rv = -2;
+		else {
+			rv = server_func(fd);
+			rv_client = uc_client_wait();
+			if (rv == 0 || (rv == -2 && rv_client != 0))
+				rv = rv_client;
+			if (uc_socket_close(fd) < 0)
+				rv = -2;
+		}
+		break;
+	default:
+		rv = -2;
+	}
+	return (rv);
+}

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_generic.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_generic.h	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax@FreeBSD.org>
+ * 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$
+ */
+
+int t_generic(int (*client_func)(int), int (*server_func)(int));

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c)
@@ -0,0 +1,153 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ucred.h>
+#include <sys/un.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_peercred.h"
+
+static int
+check_xucred(const struct xucred *xucred, socklen_t len)
+{
+	int rc;
+
+	if (len != sizeof(*xucred)) {
+		uc_logmsgx("option value size %zu != %zu",
+		    (size_t)len, sizeof(*xucred));
+		return (-1);
+	}
+
+	uc_dbgmsg("xucred.cr_version %u", xucred->cr_version);
+	uc_dbgmsg("xucred.cr_uid %lu", (u_long)xucred->cr_uid);
+	uc_dbgmsg("xucred.cr_ngroups %d", xucred->cr_ngroups);
+
+	rc = 0;
+
+	if (xucred->cr_version != XUCRED_VERSION) {
+		uc_logmsgx("xucred.cr_version %u != %d",
+		    xucred->cr_version, XUCRED_VERSION);
+		rc = -1;
+	}
+	if (xucred->cr_uid != uc_cfg.proc_cred.euid) {
+		uc_logmsgx("xucred.cr_uid %lu != %lu (EUID)",
+		    (u_long)xucred->cr_uid, (u_long)uc_cfg.proc_cred.euid);
+		rc = -1;
+	}
+	if (xucred->cr_ngroups == 0) {
+		uc_logmsgx("xucred.cr_ngroups == 0");
+		rc = -1;
+	}
+	if (xucred->cr_ngroups < 0) {
+		uc_logmsgx("xucred.cr_ngroups < 0");
+		rc = -1;
+	}
+	if (xucred->cr_ngroups > XU_NGROUPS) {
+		uc_logmsgx("xucred.cr_ngroups %hu > %u (max)",
+		    xucred->cr_ngroups, XU_NGROUPS);
+		rc = -1;
+	}
+	if (xucred->cr_groups[0] != uc_cfg.proc_cred.egid) {
+		uc_logmsgx("xucred.cr_groups[0] %lu != %lu (EGID)",
+		    (u_long)xucred->cr_groups[0], (u_long)uc_cfg.proc_cred.egid);
+		rc = -1;
+	}
+	if (uc_check_groups("xucred.cr_groups", xucred->cr_groups,
+	    "xucred.cr_ngroups", xucred->cr_ngroups, false) < 0)
+		rc = -1;
+	return (rc);
+}
+
+static int
+t_peercred_client(int fd)
+{
+	struct xucred xucred;
+	socklen_t len;
+
+	if (uc_sync_recv() < 0)
+		return (-1);
+
+	if (uc_socket_connect(fd) < 0)
+		return (-1);
+
+	len = sizeof(xucred);
+	if (getsockopt(fd, 0, LOCAL_PEERCRED, &xucred, &len) < 0) {
+		uc_logmsg("getsockopt(LOCAL_PEERCRED)");
+		return (-1);
+	}
+
+	if (check_xucred(&xucred, len) < 0)
+		return (-1);
+
+	return (0);
+}
+
+static int
+t_peercred_server(int fd1)
+{
+	struct xucred xucred;
+	socklen_t len;
+	int fd2, rv;
+
+	if (uc_sync_send() < 0)
+		return (-2);
+
+	fd2 = uc_socket_accept(fd1);
+	if (fd2 < 0)
+		return (-2);
+
+	len = sizeof(xucred);
+	if (getsockopt(fd2, 0, LOCAL_PEERCRED, &xucred, &len) < 0) {
+		uc_logmsg("getsockopt(LOCAL_PEERCRED)");
+		rv = -2;
+		goto done;
+	}
+
+	if (check_xucred(&xucred, len) < 0) {
+		rv = -1;
+		goto done;
+	}
+
+	rv = 0;
+done:
+	if (uc_socket_close(fd2) < 0)
+		rv = -2;
+	return (rv);
+}
+
+int
+t_peercred(void)
+{
+	return (t_generic(t_peercred_client, t_peercred_server));
+}

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h)
@@ -0,0 +1,29 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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$
+ */
+
+int t_peercred(void);

Copied: stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c	Mon Oct  1 17:26:41 2018	(r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c)
@@ -0,0 +1,215 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_sockcred.h"
+
+static int
+t_sockcred_client(int type, int fd)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	int rv;
+
+	if (uc_sync_recv() < 0)
+		return (-2);
+
+	rv = -2;
+
+	uc_msghdr_init_client(&msghdr, iov, NULL, 0, 0, 0);
+
+	if (uc_socket_connect(fd) < 0)
+		goto done;
+
+	if (type == 2)
+		if (uc_sync_recv() < 0)
+			goto done;
+
+	if (uc_message_sendn(fd, &msghdr) < 0)
+		goto done;
+
+	rv = 0;
+done:
+	return (rv);
+}
+
+static int
+t_sockcred_server(int type, int fd1)
+{
+	struct msghdr msghdr;
+	struct iovec iov[1];
+	struct cmsghdr *cmsghdr;
+	void *cmsg_data;
+	size_t cmsg_size;
+	u_int i;
+	int fd2, rv, val;
+
+	fd2 = -1;
+	rv = -2;
+
+	cmsg_size = CMSG_SPACE(SOCKCREDSIZE(uc_cfg.proc_cred.gid_num));
+	cmsg_data = malloc(cmsg_size);
+	if (cmsg_data == NULL) {
+		uc_logmsg("malloc");
+		goto done;
+	}
+
+	if (type == 1) {
+		uc_dbgmsg("setting LOCAL_CREDS");
+		val = 1;
+		if (setsockopt(fd1, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+			uc_logmsg("setsockopt(LOCAL_CREDS)");
+			goto done;
+		}
+	}
+
+	if (uc_sync_send() < 0)
+		goto done;
+
+	if (uc_cfg.sock_type == SOCK_STREAM) {
+		fd2 = uc_socket_accept(fd1);
+		if (fd2 < 0)
+			goto done;
+	} else
+		fd2 = fd1;
+
+	if (type == 2) {
+		uc_dbgmsg("setting LOCAL_CREDS");
+		val = 1;
+		if (setsockopt(fd2, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+			uc_logmsg("setsockopt(LOCAL_CREDS)");
+			goto done;
+		}
+		if (uc_sync_send() < 0)
+			goto done;
+	}
+
+	rv = -1;
+	for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+		uc_dbgmsg("message #%u", i);
+
+		uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+		if (uc_message_recv(fd2, &msghdr) < 0) {
+			rv = -2;
+			break;
+		}
+
+		if (i > 1 && uc_cfg.sock_type == SOCK_STREAM) {
+			if (uc_check_msghdr(&msghdr, 0) < 0)
+				break;
+		} else {
+			if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+				break;
+
+			cmsghdr = CMSG_FIRSTHDR(&msghdr);
+			if (uc_check_scm_creds_sockcred(cmsghdr) < 0)
+				break;
+		}
+	}
+	if (i > uc_cfg.ipc_msg.msg_num)
+		rv = 0;
+done:
+	free(cmsg_data);
+	if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+		if (uc_socket_close(fd2) < 0)
+			rv = -2;
+	return (rv);
+}
+
+int
+t_sockcred_1(void)
+{
+	u_int i;
+	int fd, rv, rv_client;
+
+	switch (uc_client_fork()) {
+	case 0:
+		for (i = 1; i <= 2; ++i) {
+			uc_dbgmsg("client #%u", i);
+			fd = uc_socket_create();
+			if (fd < 0)
+				rv = -2;
+			else {
+				rv = t_sockcred_client(1, fd);
+				if (uc_socket_close(fd) < 0)
+					rv = -2;
+			}
+			if (rv != 0)
+				break;
+		}

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201810011726.w91HQfG5069159>