From: Dmitry V. Levin Date: Fri, 18 Sep 2015 11:27:11 +0000 (+0000) Subject: tests: rewrite restart_syscall in C X-Git-Tag: v4.11~183 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=640623c41ecfb50c490efb3e30c1e7dd38fd81b3;p=strace tests: rewrite restart_syscall in C * tests/restart_syscall.c: New file. * tests/restart_syscall.expected: Remove. * tests/restart_syscall_unknown.expected: Remove. * tests/restart_syscall.test: Update to use restart_syscall. * tests/Makefile.am (check_PROGRAMS): Add restart_syscall. (EXTRA_DIST): Remove restart_syscall.expected and restart_syscall_unknown.expected. * tests/.gitignore: Add restart_syscall. --- diff --git a/tests/.gitignore b/tests/.gitignore index e08474bf..34a86a22 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -32,6 +32,7 @@ ppoll pselect6 readlink readlinkat +restart_syscall rt_sigqueueinfo sched_xetattr scm_rights diff --git a/tests/Makefile.am b/tests/Makefile.am index ee484f82..e699086f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -45,6 +45,7 @@ check_PROGRAMS = \ pselect6 \ readlink \ readlinkat \ + restart_syscall \ rt_sigqueueinfo \ sched_xetattr \ scm_rights \ @@ -210,8 +211,6 @@ EXTRA_DIST = init.sh run.sh match.awk \ pipe.expected \ ppoll.expected \ ppoll-v.expected \ - restart_syscall.expected \ - restart_syscall_unknown.expected \ sigaction.awk \ sigaltstack.expected \ signalfd.expected \ diff --git a/tests/restart_syscall.c b/tests/restart_syscall.c new file mode 100644 index 00000000..645be319 --- /dev/null +++ b/tests/restart_syscall.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +int +main(void) +{ + const sigset_t set = {}; + const struct sigaction act = { .sa_handler = SIG_IGN }; + const struct itimerval itv = { .it_value.tv_usec = 111111 }; + struct timespec req = { .tv_nsec = 222222222 }, rem; + + if (sigaction(SIGALRM, &act, NULL)) + return 77; + if (sigprocmask(SIG_SETMASK, &set, NULL)) + return 77; + if (setitimer(ITIMER_REAL, &itv, NULL)) + return 77; + if (nanosleep(&req, &rem)) + return 0; + + printf("nanosleep\\(\\{%jd, %jd\\}, \\{%jd, %jd\\}\\)" + " = \\? ERESTART_RESTARTBLOCK \\(Interrupted by signal\\)\n", + (intmax_t) req.tv_sec, (intmax_t) req.tv_nsec, + (intmax_t) rem.tv_sec, (intmax_t) rem.tv_nsec); + puts("--- SIGALRM \\{si_signo=SIGALRM, si_code=SI_KERNEL\\} ---"); + printf("(nanosleep\\(\\{%jd, %jd\\}, %p|restart_syscall\\(<\\.\\.\\." + " resuming interrupted nanosleep \\.\\.\\.>)\\) = 0\n", + (intmax_t) req.tv_sec, (intmax_t) req.tv_nsec, &rem); + puts("\\+\\+\\+ exited with 0 \\+\\+\\+"); + + return 0; +} diff --git a/tests/restart_syscall.expected b/tests/restart_syscall.expected deleted file mode 100644 index af9267de..00000000 --- a/tests/restart_syscall.expected +++ /dev/null @@ -1,2 +0,0 @@ -restart_syscall(<... resuming interrupted nanosleep ...>) = 0 -+++ exited with 0 +++ diff --git a/tests/restart_syscall.test b/tests/restart_syscall.test index 0e74b2c9..ff43bf63 100755 --- a/tests/restart_syscall.test +++ b/tests/restart_syscall.test @@ -4,27 +4,11 @@ . "${srcdir=.}/init.sh" -check_prog sleep -check_prog grep -run_strace -enanosleep sleep 1 -LC_ALL=C grep ^nanosleep < "$LOG" > /dev/null || - framework_skip_ 'sleep does not use nanosleep' - -./set_ptracer_any sleep 2 & -sleep 1 -run_strace -q -erestart_syscall,nanosleep -p $! - -LC_ALL=C grep ^restart_syscall < "$LOG" > /dev/null || -if LC_ALL=C grep -x 'nanosleep({2, 0}, NULL) \+= 0' < "$LOG" > /dev/null; then - skip_ 'no restart_syscall, uninterrupted nanosleep' -fi - -case "$STRACE_ARCH" in - alpha|mips|or1k|s390|s390x) - # These architectures use the same register - # both for syscall number and syscall return code. - match_diff "$srcdir/restart_syscall_unknown.expected" "$LOG" - ;; - *) match_diff - ;; -esac +run_prog > /dev/null +OUT="$LOG.out" +syscalls=nanosleep,restart_syscall +run_strace -a20 -e trace=$syscalls $args > "$OUT" +match_grep "$LOG" "$OUT" +rm -f "$OUT" + +exit 0 diff --git a/tests/restart_syscall_unknown.expected b/tests/restart_syscall_unknown.expected deleted file mode 100644 index 5f168953..00000000 --- a/tests/restart_syscall_unknown.expected +++ /dev/null @@ -1,2 +0,0 @@ -restart_syscall(<... resuming interrupted system call ...>) = 0 -+++ exited with 0 +++