From: Sepherosa Ziehau Date: Fri, 6 Nov 2015 15:58:28 +0000 (+0800) Subject: test: Add test for unix socket cross/self reference X-Git-Tag: v4.5.0~132 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/30b61e7cec04517bc54b30c2255ae99c9e2fa37a test: Add test for unix socket cross/self reference cross ref: s1 on s2 rcvbuf, while s2 on s1 rcvbuf. self ref: s1 on s1 rcvbuf, while s2 on s2 rcvbuf. --- diff --git a/test/unix/loopdesc/Makefile b/test/unix/loopdesc/Makefile new file mode 100644 index 0000000000..9d64565e05 --- /dev/null +++ b/test/unix/loopdesc/Makefile @@ -0,0 +1,6 @@ +PROG = loopdesc +WARNS = 6 +NOMAN = YES +BINDIR= /usr/local/bin + +.include diff --git a/test/unix/loopdesc/loopdesc.c b/test/unix/loopdesc/loopdesc.c new file mode 100644 index 0000000000..34fc9e5a43 --- /dev/null +++ b/test/unix/loopdesc/loopdesc.c @@ -0,0 +1,87 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +static void +test_sendto_self(int to_s, int s) +{ + struct msghdr msg; + struct iovec iov; + union { + struct cmsghdr cm; + uint8_t data[CMSG_SPACE(sizeof(int))]; + } ctrl; + struct cmsghdr *cm; + int n, buf; + + iov.iov_base = &buf; + iov.iov_len = sizeof(buf); + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = ctrl.data; + msg.msg_controllen = sizeof(ctrl.data); + + memset(&ctrl, 0, sizeof(ctrl)); + cm = CMSG_FIRSTHDR(&msg); + cm->cmsg_len = CMSG_LEN(sizeof(int)); + cm->cmsg_level = SOL_SOCKET; + cm->cmsg_type = SCM_RIGHTS; + *((int *)CMSG_DATA(cm)) = s; + + n = sendmsg(to_s, &msg, 0); + if (n < 0) + err(1, "sendmsg failed"); + else if (n != sizeof(buf)) + errx(1, "sendmsg sent %d", n); +} + +static void +usage(const char *cmd) +{ + fprintf(stderr, "%s [-x]\n", cmd); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int s[2], opt, xref; + + xref = 0; + while ((opt = getopt(argc, argv, "x")) != -1) { + switch (opt) { + case 'x': + xref = 1; + break; + + default: + usage(argv[0]); + } + } + + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, s) < 0) + err(1, "socketpair(LOCAL, STREAM) failed"); + + if (xref) { + fprintf(stderr, "cross reference\n"); + /* Send s[0] to s[1].rcvbuf */ + test_sendto_self(s[0], s[0]); + /* Send s[1] to s[0].rcvbuf */ + test_sendto_self(s[1], s[1]); + } else { + fprintf(stderr, "self reference\n"); + /* Send s[0] to s[0].rcvbuf */ + test_sendto_self(s[1], s[0]); + /* Send s[1] to s[1].rcvbuf */ + test_sendto_self(s[0], s[1]); + } + exit(0); +}