tests: add a test for the latest dumpio fix

* tests/dumpio.expected: New file.
* tests/unix-pair-send-recv.c: New file.
* tests/dumpio.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add unix-pair-send-recv.
(TESTS): Add dumpio.test.
(EXTRA_DIST): Add dumpio.expected.
* tests/.gitignore: Add unix-pair-send-recv.
diff --git a/tests/.gitignore b/tests/.gitignore
index 1510bc9..c96ee1f 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -20,6 +20,7 @@
 uid16
 uid32
 uio
+unix-pair-send-recv
 *.log
 *.log.*
 *.o
diff --git a/tests/Makefile.am b/tests/Makefile.am
index b2b5945..901df50 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -24,7 +24,8 @@
 	uid \
 	uid16 \
 	uid32 \
-	uio
+	uio \
+	unix-pair-send-recv
 
 stat_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
 statfs_CFLAGS = $(AM_CFLAGS) -D_FILE_OFFSET_BITS=64
@@ -37,6 +38,7 @@
 	strace-f.test \
 	qual_syscall.test \
 	caps.test \
+	dumpio.test \
 	fanotify_mark.test \
 	getdents.test \
 	ioctl.test \
@@ -71,6 +73,7 @@
 
 EXTRA_DIST = init.sh run.sh \
 	     caps.awk \
+	     dumpio.expected \
 	     getdents.awk \
 	     mmsg.expected \
 	     net-yy-accept.awk \
diff --git a/tests/dumpio.expected b/tests/dumpio.expected
new file mode 100644
index 0000000..f8fd244
--- /dev/null
+++ b/tests/dumpio.expected
@@ -0,0 +1,7 @@
+sendto(0, "zyxwvutsrqponmlkjihgfedcba", 26, MSG_DONTROUTE, NULL, 0) = 26
+ | 00000  7a 79 78 77 76 75 74 73  72 71 70 6f 6e 6d 6c 6b  zyxwvutsrqponmlk |
+ | 00010  6a 69 68 67 66 65 64 63  62 61                    jihgfedcba       |
+recvfrom(0, "abcdefghijklmnopqrstuvwxyz", 26, MSG_WAITALL, NULL, NULL) = 26
+ | 00000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop |
+ | 00010  71 72 73 74 75 76 77 78  79 7a                    qrstuvwxyz       |
++++ exited with 0 +++
diff --git a/tests/dumpio.test b/tests/dumpio.test
new file mode 100755
index 0000000..ef3792d
--- /dev/null
+++ b/tests/dumpio.test
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# Check how dumpio works.
+
+. "${srcdir=.}/init.sh"
+
+dumpio_expected="${srcdir=.}/dumpio.expected"
+cat "$dumpio_expected" > /dev/null ||
+	fail_ "$dumpio_expected is not available"
+
+check_prog diff
+
+args='./unix-pair-send-recv abcdefghijklmnopqrstuvwxyz'
+$args ||
+	fail_ "$args failed"
+
+args="-esignal=none -esendto,recvfrom -eread=0 -ewrite=0 $args"
+$STRACE -o "$LOG" $args || {
+	cat "$LOG"
+	fail_ "$STRACE $args failed"
+}
+
+diff "$dumpio_expected" "$LOG" ||
+	fail_ "$STRACE $args failed to dump i/o properly"
+
+exit 0
diff --git a/tests/unix-pair-send-recv.c b/tests/unix-pair-send-recv.c
new file mode 100644
index 0000000..535f8e7
--- /dev/null
+++ b/tests/unix-pair-send-recv.c
@@ -0,0 +1,57 @@
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+
+static void
+transpose(char *str, int len)
+{
+	int i;
+
+	for (i = 0; i < len / 2; ++i) {
+		char c = str[i];
+		str[i] = str[len - 1 - i];
+		str[len - 1 - i] = c;
+	}
+}
+
+int
+main(int ac, char **av)
+{
+	assert(ac == 2);
+	const int len = strlen(av[1]);
+	assert(len);
+
+	(void) close(0);
+	(void) close(1);
+
+	int sv[2];
+	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == 0);
+	assert(sv[0] == 0);
+	assert(sv[1] == 1);
+
+	pid_t pid = fork();
+	assert(pid >= 0);
+
+	if (pid) {
+		assert(close(1) == 0);
+		transpose(av[1], len);
+		assert(sendto(0, av[1], len, MSG_DONTROUTE, NULL, 0) == len);
+		assert(recvfrom(0, av[1], len, MSG_WAITALL, NULL, NULL) == len);
+		assert(close(0) == 0);
+
+                int status;
+		assert(waitpid(pid, &status, 0) == pid);
+		assert(status == 0);
+	} else {
+		assert(close(0) == 0);
+		assert(recvfrom(1, av[1], len, MSG_WAITALL, NULL, NULL) == len);
+		transpose(av[1], len);
+		assert(sendto(1, av[1], len, MSG_DONTROUTE, NULL, 0) == len);
+		assert(recvfrom(1, av[1], len, MSG_WAITALL, NULL, NULL) == 0);
+		assert(close(1) == 0);
+	}
+
+	return 0;
+}