[PATCH 11/11] tests: Add test for decoding fadvise syscall
Eugene Syromyatnikov
evgsyr at gmail.com
Wed Sep 21 21:21:57 UTC 2016
* tests/.gitignore: Add fadvise64, fadvise64_64.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(DECODER_TESTS): Add fadvise64.test, fadvise64_64.test.
* fadvise64.c: New file.
* fadvise64_64.c: Likewise.
* fadvise64.test: Likewise.
* fadvise64_64.test: Likewise.
---
tests/.gitignore | 2 ++
tests/Makefile.am | 4 +++
tests/fadvise64.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++
tests/fadvise64.test | 6 ++++
tests/fadvise64_64.c | 59 +++++++++++++++++++++++++++++++++++++++
tests/fadvise64_64.test | 6 ++++
6 files changed, 148 insertions(+)
create mode 100644 tests/fadvise64.c
create mode 100755 tests/fadvise64.test
create mode 100644 tests/fadvise64_64.c
create mode 100755 tests/fadvise64_64.test
diff --git a/tests/.gitignore b/tests/.gitignore
index c3665c2..b41459a 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -44,6 +44,8 @@ execve-v
execveat
execveat-v
faccessat
+fadvise64
+fadvise64_64
fallocate
fanotify_mark
fchdir
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4fdc877..424c5bb 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -103,6 +103,8 @@ check_PROGRAMS = \
execveat \
execveat-v \
faccessat \
+ fadvise64 \
+ fadvise64_64 \
fallocate \
fanotify_mark \
fchdir \
@@ -443,6 +445,8 @@ DECODER_TESTS = \
execveat-v.test \
execveat.test \
faccessat.test \
+ fadvise64.test \
+ fadvise64_64.test \
fallocate.test \
fanotify_mark.test \
fchdir.test \
diff --git a/tests/fadvise64.c b/tests/fadvise64.c
new file mode 100644
index 0000000..812d4f3
--- /dev/null
+++ b/tests/fadvise64.c
@@ -0,0 +1,71 @@
+#include "tests.h"
+
+#include <asm/unistd.h>
+
+#if defined(__NR_fadvise64)
+
+# include <errno.h>
+# include <limits.h>
+# include <stdio.h>
+# include <unistd.h>
+
+# include "xlat.h"
+# include "xlat/advise.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) LO, HI
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) HI, LO
+#endif
+
+void do_fadvise64(int fd, long long offset, long long len, int advice)
+{
+ long ret;
+
+# if (LONG_MAX > INT_MAX) || defined(__x86_64__) && defined(__ILP32__) \
+ || defined(LINUX_MIPSN32)
+ ret = syscall(__NR_fadvise64, fd, offset, len, advice);
+
+ printf("fadvise64(%d, %lld, %llu, ", fd, offset, len);
+# else /* LONG_MAX > INT_MAX */
+# if defined(POWERPC)
+ ret = syscall(__NR_fadvise64, fd, 0,
+ __LONG_LONG_PAIR ((long) (offset >> 32), (long) offset),
+ (long) len, advice);
+ printf("fadvise64(%d, %lld, %lu, ", fd, offset, (long) len);
+# elif defined(LINUX_MIPSO32)
+ ret = syscall(__NR_fadvise64, fd, 0,
+ __LONG_LONG_PAIR ((long) (offset >> 32), (long) offset),
+ __LONG_LONG_PAIR ((long) (len >> 32), (long) len), advice);
+ printf("fadvise64(%d, %lld, %lld, ", fd, offset, len);
+# else
+ ret = syscall(__NR_fadvise64, fd,
+ __LONG_LONG_PAIR ((long) (offset >> 32), (long) offset),
+ (long) len, advice);
+ printf("fadvise64(%d, %lld, %lu, ", fd, offset, (long) len);
+# endif
+# endif /* LONG_MAX > INT_MAX */
+ printxval(advise, (unsigned) advice, "POSIX_FADV_???");
+ printf(") = %s\n", sprintrc(ret));
+}
+
+int
+main(void)
+{
+ static const int bogus_fd = 0xbeefface;
+ static const long long bogus_offset = 0xbadc0dedda7a1057LLU;
+ static const long long bogus_len = (long) 0xbadfaceca7b0d1e5LLU;
+ static const int bogus_advice = 0xdeadca75;
+
+ do_fadvise64(bogus_fd, bogus_offset, bogus_len, bogus_advice);
+
+ puts("+++ exited with 0 +++");
+
+ return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_fadvise64");
+
+#endif
diff --git a/tests/fadvise64.test b/tests/fadvise64.test
new file mode 100755
index 0000000..46c5856
--- /dev/null
+++ b/tests/fadvise64.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check fadvise64 syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
diff --git a/tests/fadvise64_64.c b/tests/fadvise64_64.c
new file mode 100644
index 0000000..35f64a0
--- /dev/null
+++ b/tests/fadvise64_64.c
@@ -0,0 +1,59 @@
+#include "tests.h"
+
+#include <asm/unistd.h>
+
+#if defined(__NR_fadvise64_64) || defined(__NR_arm_fadvise64_64)
+
+# include <errno.h>
+# include <limits.h>
+# include <stdio.h>
+# include <unistd.h>
+
+# include "xlat.h"
+# include "xlat/advise.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) LO, HI
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) HI, LO
+#endif
+
+void do_fadvise64_64(int fd, long long offset, long long len, int advice)
+{
+ long ret;
+
+# ifdef ARM
+ ret = syscall(__NR_arm_fadvise64_64, fd, advice,
+ __LONG_LONG_PAIR ((long) (offset >> 32), (long) offset),
+ __LONG_LONG_PAIR ((long) (len >> 32), (long)len));
+# else
+ ret = syscall(__NR_fadvise64_64, fd,
+ __LONG_LONG_PAIR ((long) (offset >> 32), (long) offset),
+ __LONG_LONG_PAIR ((long) (len >> 32), (long) len), advice);
+# endif
+
+ printf("fadvise64_64(%d, %lld, %lld, ", fd, offset, len);
+ printxval(advise, (unsigned) advice, "POSIX_FADV_???");
+ printf(") = %s\n", sprintrc(ret));
+}
+
+int
+main(void)
+{
+ static const int bogus_fd = 0xbeefface;
+ static const long long bogus_offset = 0xbadc0dedda7a1057LLU;
+ static const long long bogus_len = (long) 0xbadfaceca7b0d1e5LLU;
+ static const int bogus_advice = 0xdeadca75;
+
+ do_fadvise64_64(bogus_fd, bogus_offset, bogus_len, bogus_advice);
+
+ puts("+++ exited with 0 +++");
+
+ return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_fadvise64_64 || __NR_arm_fadvise64_64");
+
+#endif
diff --git a/tests/fadvise64_64.test b/tests/fadvise64_64.test
new file mode 100755
index 0000000..67a37c0
--- /dev/null
+++ b/tests/fadvise64_64.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check fadvise64_64 syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a18
--
1.7.10.4
More information about the Strace-devel
mailing list