Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Dec 2016 17:21:04 +0000 (UTC)
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r309554 - head/tools/regression/sockets/unix_cmsg
Message-ID:  <201612051721.uB5HL48d098345@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sobomax
Date: Mon Dec  5 17:21:04 2016
New Revision: 309554
URL: https://svnweb.freebsd.org/changeset/base/309554

Log:
  Refactor the regression test code by splitting huge monolithic C
  file into smaller pieces that are hopefully easier to understand
  and extend. This is to pave the ground for adding few more
  socket timestamp formats that I am working on here.
  
  No functional changes (I hope).

Added:
  head/tools/regression/sockets/unix_cmsg/t_bintime.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_bintime.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_generic.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_generic.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_peercred.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_peercred.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_sockcred.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_sockcred.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_timeval.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/t_timeval.h   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/uc_common.c   (contents, props changed)
  head/tools/regression/sockets/unix_cmsg/uc_common.h   (contents, props changed)
Modified:
  head/tools/regression/sockets/unix_cmsg/Makefile
  head/tools/regression/sockets/unix_cmsg/unix_cmsg.c

Modified: head/tools/regression/sockets/unix_cmsg/Makefile
==============================================================================
--- head/tools/regression/sockets/unix_cmsg/Makefile	Mon Dec  5 15:55:51 2016	(r309553)
+++ head/tools/regression/sockets/unix_cmsg/Makefile	Mon Dec  5 17:21:04 2016	(r309554)
@@ -1,6 +1,10 @@
 # $FreeBSD$
 
 PROG=	unix_cmsg
+SRCS=	unix_cmsg.c t_bintime.h t_bintime.c uc_common.h uc_common.c \
+	t_generic.h t_generic.c t_peercred.h t_peercred.c t_timeval.h \
+	t_timeval.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
 MAN=
 WARNS?=	3
 

Added: head/tools/regression/sockets/unix_cmsg/t_bintime.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_bintime.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -0,0 +1,156 @@
+/*-
+ * 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/time.h>
+#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 "t_bintime.h"
+#include "t_generic.h"
+#include "uc_common.h"
+
+static int
+check_scm_bintime(struct cmsghdr *cmsghdr)
+{
+        const struct bintime *bt;
+
+        if (uc_check_cmsghdr(cmsghdr, SCM_BINTIME, sizeof(struct bintime)) < 0)
+                return (-1);
+
+        bt = (struct bintime *)CMSG_DATA(cmsghdr);
+
+        uc_dbgmsg("bintime.sec %"PRIdMAX", bintime.frac %"PRIu64,
+            (intmax_t)bt->sec, bt->frac);
+
+        return (0);
+}
+
+static int
+t_bintime_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 bintime));
+        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_BINTIME, sizeof(struct bintime));
+
+        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_bintime_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 bintime));
+        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 (check_scm_bintime(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_bintime(void)
+{
+        return (t_generic(t_bintime_client, t_bintime_server));
+}

Added: head/tools/regression/sockets/unix_cmsg/t_bintime.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_bintime.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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_bintime(void);

Added: head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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

Added: head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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

Added: head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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));
+}

Added: head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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);

Added: head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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));
+}

Added: head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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);

Added: head/tools/regression/sockets/unix_cmsg/t_generic.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_generic.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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);
+}

Added: head/tools/regression/sockets/unix_cmsg/t_generic.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_generic.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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));

Added: head/tools/regression/sockets/unix_cmsg/t_peercred.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_peercred.c	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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));
+}

Added: head/tools/regression/sockets/unix_cmsg/t_peercred.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/t_peercred.h	Mon Dec  5 17:21:04 2016	(r309554)
@@ -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

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



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