From 1c444a75d1f67e5f5df98870cf8f15a86cc4b0a1 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 18 Jul 2016 11:22:06 +0000 Subject: [PATCH] tests: check decoding of timeout argument of recvmmsg syscall * tests/recvmmsg-timeout.c: New file. * tests/recvmmsg-timeout.test: New test. * tests/.gitignore: Add recvmmsg-timeout. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add recvmmsg-timeout.test. --- tests/.gitignore | 1 + tests/Makefile.am | 2 ++ tests/recvmmsg-timeout.c | 70 +++++++++++++++++++++++++++++++++++++ tests/recvmmsg-timeout.test | 6 ++++ 4 files changed, 79 insertions(+) create mode 100644 tests/recvmmsg-timeout.c create mode 100755 tests/recvmmsg-timeout.test diff --git a/tests/.gitignore b/tests/.gitignore index 03309849..3cd1cfe8 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -186,6 +186,7 @@ readlinkat readv reboot recvfrom +recvmmsg-timeout recvmsg remap_file_pages rename diff --git a/tests/Makefile.am b/tests/Makefile.am index 3c873625..fe208f25 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -242,6 +242,7 @@ check_PROGRAMS = \ readv \ reboot \ recvfrom \ + recvmmsg-timeout \ recvmsg \ remap_file_pages \ rename \ @@ -559,6 +560,7 @@ DECODER_TESTS = \ readv.test \ reboot.test \ recvfrom.test \ + recvmmsg-timeout.test \ recvmsg.test \ remap_file_pages.test \ rename.test \ diff --git a/tests/recvmmsg-timeout.c b/tests/recvmmsg-timeout.c new file mode 100644 index 00000000..4afd8a60 --- /dev/null +++ b/tests/recvmmsg-timeout.c @@ -0,0 +1,70 @@ +/* + * Check decoding of timeout argument of recvmmsg syscall. + * + * Copyright (c) 2016 Dmitry V. Levin + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 "tests.h" +#include + +#include "msghdr.h" + +int +main(void) +{ + int fds[2]; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) + perror_msg_and_skip("socketpair"); + + if (send(fds[1], "A", 1, 0) != 1) + perror_msg_and_skip("send"); + + char buf; + struct iovec iov = { .iov_base = &buf, .iov_len = sizeof(buf) }; + struct mmsghdr mh = { + .msg_hdr = { + .msg_iov = &iov, + .msg_iovlen = 1 + } + }; + struct timespec t = { .tv_sec = 0, .tv_nsec = 12345678 }; + + int rc = recv_mmsg(-1, &mh, 1, 0, &t); + printf("recvmmsg(-1, %p, 1, 0, {0, 12345678})" + " = %d %s (%m)\n", &mh, rc, errno2name()); + + rc = recv_mmsg(fds[0], &mh, 1, 0, &t); + if (rc < 0) + perror_msg_and_skip("recvmmsg"); + printf("recvmmsg(%d, [{msg_hdr={msg_name=NULL, msg_namelen=0" + ", msg_iov=[{iov_base=\"A\", iov_len=1}], msg_iovlen=1" + ", msg_controllen=0, msg_flags=0}, msg_len=1}], 1, 0" + ", {0, 12345678}) = %d (left {0, %d})\n", + fds[0], rc, (int) t.tv_nsec); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/recvmmsg-timeout.test b/tests/recvmmsg-timeout.test new file mode 100755 index 00000000..36a12221 --- /dev/null +++ b/tests/recvmmsg-timeout.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of timeout argument of recvmmsg syscall. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a25 -e trace=recvmmsg -- 2.40.0