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 <sobo...@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 <sobo...@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 <sobo...@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 ***
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to