From: Eugene Syromyatnikov Date: Fri, 2 Sep 2016 15:28:24 +0000 (+0300) Subject: tests: check decoding of readahead syscall X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0c766339fee3e322151ea90573fff5773b02d28b;p=strace tests: check decoding of readahead syscall * configure.ac (AC_CHECK_FUNCS): Add readahead. * tests/readahead.c: New file. * tests/readahead.test: New test. * tests/.gitignore: Add readahead. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add readahead.test. --- diff --git a/configure.ac b/configure.ac index 5048de31..dc84a492 100644 --- a/configure.ac +++ b/configure.ac @@ -295,6 +295,7 @@ AC_CHECK_FUNCS(m4_normalize([ preadv process_vm_readv pwritev + readahead signalfd stpcpy strerror diff --git a/tests/.gitignore b/tests/.gitignore index 5c5d0927..8c41bea6 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -185,6 +185,7 @@ pselect6 ptrace pwritev read-write +readahead readdir readlink readlinkat diff --git a/tests/Makefile.am b/tests/Makefile.am index 2cf96748..0b3b818d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -242,6 +242,7 @@ check_PROGRAMS = \ ptrace \ pwritev \ read-write \ + readahead \ readdir \ readlink \ readlinkat \ @@ -569,6 +570,7 @@ DECODER_TESTS = \ ptrace.test \ pwritev.test \ read-write.test \ + readahead.test \ readdir.test \ readlink.test \ readlinkat.test \ diff --git a/tests/readahead.c b/tests/readahead.c new file mode 100644 index 00000000..5677c1ed --- /dev/null +++ b/tests/readahead.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016 Eugene Syromiatnikov + * 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 + +#ifdef HAVE_READAHEAD +# ifdef __GLIBC__ +/* + * Check for glibc readahead off64_t argument passing bug, + * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 + */ +# if !(defined __GLIBC_MINOR__ && \ + (__GLIBC__ << 16) + __GLIBC_MINOR__ >= (2 << 16) + 8) +# undef HAVE_READAHEAD +# endif +# endif /* __GLIBC__ */ +#endif /* HAVE_READAHEAD */ + +#ifdef HAVE_READAHEAD + +# include +# include + +static const int fds[] = { + -0x80000000, + -100, + -1, + 0, + 1, + 2, + 0x7fffffff, +}; + +static const off64_t offsets[] = { + -0x8000000000000000LL, + -0x5060708090a0b0c0LL, + -1LL, + 0, + 1, + 0xbadfaced, + 0x7fffffffffffffffLL, +}; + +static const unsigned long counts[] = { + 0UL, + 0xdeadca75, + (unsigned long) 0xface1e55beeff00dULL, + (unsigned long) 0xffffffffffffffffULL, +}; + +int +main(void) +{ + unsigned i; + unsigned j; + unsigned k; + ssize_t rc; + + for (i = 0; i < ARRAY_SIZE(fds); i++) + for (j = 0; j < ARRAY_SIZE(offsets); j++) + for (k = 0; k < ARRAY_SIZE(counts); k++) { + rc = readahead(fds[i], offsets[j], counts[k]); + + printf("readahead(%d, %lld, %lu) = %s\n", + fds[i], (long long) offsets[j], + counts[k], sprintrc(rc)); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("HAVE_READAHEAD") + +#endif diff --git a/tests/readahead.test b/tests/readahead.test new file mode 100755 index 00000000..397c6903 --- /dev/null +++ b/tests/readahead.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check readahead syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a1