[PATCH v3] tests: check decoding of readahead syscall

2016-09-04 Thread Eugene Syromyatnikov
* 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.
---
Changes since v2:
 * Added workaround for an old glibc bug
   (https://sourceware.org/bugzilla/show_bug.cgi?id=5208) which is still
   present in RHEL 5.

 tests/.gitignore |1 +
 tests/Makefile.am|2 ++
 tests/readahead.c|   89 ++
 tests/readahead.test |6 
 4 files changed, 98 insertions(+)
 create mode 100644 tests/readahead.c
 create mode 100755 tests/readahead.test

diff --git a/tests/.gitignore b/tests/.gitignore
index 5c5d092..8c41bea 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 2cf9674..0b3b818 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 000..6f50e38
--- /dev/null
+++ b/tests/readahead.c
@@ -0,0 +1,89 @@
+#include "tests.h"
+#include 
+
+#ifdef __NR_readahead
+
+# include 
+# include 
+# include 
+
+# if !defined(STRACE_READAHEAD_USE_SYSCALL)
+#  if defined(__GNU_LIBRARY__)
+/* Check for glibc readahead off64_t argument passing bug,
+ * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 */
+#   if defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \
+   (__GLIBC__ * 1000 + __GLIBC_MINOR__ > 2007)
+#define STRACE_READAHEAD_USE_SYSCALL 0
+#   else
+#define STRACE_READAHEAD_USE_SYSCALL 1
+#   endif
+#  else /* !defined(__GNU_LIBRARY__) */
+#   define STRACE_READAHEAD_USE_SYSCALL 0
+#  endif /* defined(__GNU_LIBRARY__) */
+# endif /* !defined(READAHED_USE_SYSCALL) */
+
+static const int fds[] = {
+   -0x8000,
+   -100,
+   -1,
+   0,
+   1,
+   2,
+   0x7fff,
+};
+
+static const off64_t offsets[] = {
+   -0x8000LL,
+   -0x5060708090a0b0c0LL,
+   -1LL,
+0,
+1,
+0xbadfaced,
+0x7fffLL,
+};
+
+static const unsigned long counts[] = {
+   0UL,
+   0xdeadca75,
+   (unsigned long)0xface1e55beeff00dULL,
+   (unsigned long)0xULL,
+};
+
+static inline ssize_t
+do_readahead(int fd, off64_t offset, size_t count)
+{
+#if STRACE_READAHEAD_USE_SYSCALL
+   return syscall(__NR_readahead, fd, offset, count);
+#else
+   return readahead(fd, offset, count);
+#endif
+}
+
+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 = do_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("__NR_readahead")
+
+#endif
diff --git a/tests/readahead.test b/tests/readahead.test
new file mode 100755
index 000..397c690
--- /dev/null
+++ b/tests/readahead.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check readahead syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH v3.1] tests: check decoding of readahead syscall

2016-09-04 Thread Eugene Syromyatnikov
* 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.
---
Changes from v3:
 * Scraping incorrect attempt to work around glibc bug, now just skipping
   the test.

 tests/.gitignore |1 +
 tests/Makefile.am|2 ++
 tests/readahead.c|   79 ++
 tests/readahead.test |6 
 4 files changed, 88 insertions(+)
 create mode 100644 tests/readahead.c
 create mode 100755 tests/readahead.test

diff --git a/tests/.gitignore b/tests/.gitignore
index 5c5d092..8c41bea 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 2cf9674..0b3b818 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 000..f5972af
--- /dev/null
+++ b/tests/readahead.c
@@ -0,0 +1,79 @@
+#include "tests.h"
+#include 
+
+#if !defined(STRACE_READAHEAD_BROKEN)
+# if defined(__GNU_LIBRARY__)
+/* Check for glibc readahead off64_t argument passing bug,
+ * see https://sourceware.org/bugzilla/show_bug.cgi?id=5208 */
+#  if defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \
+   (__GLIBC__ * 1000 + __GLIBC_MINOR__ <= 2007)
+#   define STRACE_READAHEAD_BROKEN 1
+#  endif
+# endif /* defined(__GNU_LIBRARY__) */
+#endif /* !defined(STRACE_READAHEAD_BROKEN) */
+
+#if defined(STRACE_READAHEAD_BROKEN) && STRACE_READAHEAD_BROKEN && \
+   defined(__NR_readahead)
+# undef __NR_readahead
+#endif
+
+#ifdef __NR_readahead
+
+# include 
+# include 
+# include 
+
+static const int fds[] = {
+   -0x8000,
+   -100,
+   -1,
+   0,
+   1,
+   2,
+   0x7fff,
+};
+
+static const off64_t offsets[] = {
+   -0x8000LL,
+   -0x5060708090a0b0c0LL,
+   -1LL,
+0,
+1,
+0xbadfaced,
+0x7fffLL,
+};
+
+static const unsigned long counts[] = {
+   0UL,
+   0xdeadca75,
+   (unsigned long)0xface1e55beeff00dULL,
+   (unsigned long)0xULL,
+};
+
+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("__NR_readahead")
+
+#endif
diff --git a/tests/readahead.test b/tests/readahead.test
new file mode 100755
index 000..397c690
--- /dev/null
+++ b/tests/readahead.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check readahead syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 0/9] Minor decoder fixes and various tests amendments

2016-09-04 Thread Eugene Syromyatnikov
Hello.

This is quite inconsistent collection of patches for various decoder
test in attempt to make them more thorough.

Eugene Syromyatnikov (9):
  tests: check decoding of perf_event_open syscall
  tests: Use sprintrc for return code output in sched_xetscheduler test
  tests: Additional decoder tests in sched_xetscheduler
  tests: Use sprintrc for return code output in sched_rr_get_interval
test
  tests: Additional decoder tests in sched_rr_get_interval
  aio: Use printfd for fd printing
  tests: Use sprintrc for return code output in aio test
  tests: min_nr and nr arguments in io_getevents should be long
  tests: Some additional aio checks

 aio.c |   21 
 tests/.gitignore  |1 +
 tests/Makefile.am |2 +
 tests/aio.c   |  120 ++---
 tests/perf_event_open.c   |   83 
 tests/perf_event_open.test|6 +++
 tests/sched_rr_get_interval.c |   22 ++--
 tests/sched_xetscheduler.c|   23 +++-
 8 files changed, 258 insertions(+), 20 deletions(-)
 create mode 100644 tests/perf_event_open.c
 create mode 100755 tests/perf_event_open.test

-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 1/9] tests: check decoding of perf_event_open syscall

2016-09-04 Thread Eugene Syromyatnikov
* tests/perf_event_open.c: New file.
* tests/perf_event_open.test: New test.
* tests/.gitignore: Add perf_event_open.
* tests/Makefile.am (check_PROGRAMS): Likewise.
  (DECODER_TESTS): Add perf_event_open.test.
---
 tests/.gitignore   |1 +
 tests/Makefile.am  |2 ++
 tests/perf_event_open.c|   83 
 tests/perf_event_open.test |6 
 4 files changed, 92 insertions(+)
 create mode 100644 tests/perf_event_open.c
 create mode 100755 tests/perf_event_open.test

diff --git a/tests/.gitignore b/tests/.gitignore
index 8c41bea..84a795d 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -170,6 +170,7 @@ open
 openat
 pause
 pc
+perf_event_open
 personality
 pipe
 poll
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0b3b818..3e3d073 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -227,6 +227,7 @@ check_PROGRAMS = \
openat \
pause \
pc \
+   perf_event_open \
personality \
pipe \
poll \
@@ -555,6 +556,7 @@ DECODER_TESTS = \
open.test \
openat.test \
pause.test \
+   perf_event_open.test \
personality.test \
pipe.test \
poll.test \
diff --git a/tests/perf_event_open.c b/tests/perf_event_open.c
new file mode 100644
index 000..afdd71d
--- /dev/null
+++ b/tests/perf_event_open.c
@@ -0,0 +1,83 @@
+#include "tests.h"
+#include 
+
+#ifdef __NR_perf_event_open
+
+# include 
+# include 
+# include 
+
+# include 
+# include 
+
+#if ULONG_MAX > UINT_MAX
+#define LONG_STR_PREFIX ""
+#else
+#define LONG_STR_PREFIX ""
+#endif
+
+static const char *printaddr(void *ptr)
+{
+   static char buf[sizeof("0x") + sizeof(void *) * 2];
+
+   if (ptr == NULL)
+   return "NULL";
+
+   snprintf(buf, sizeof(buf), "%#lx", (unsigned long)ptr);
+
+   return buf;
+}
+
+int
+main(void)
+{
+   struct perf_event_attr *attr = tail_alloc(sizeof(*attr));
+
+   attr->type = PERF_TYPE_HARDWARE;
+   attr->size = sizeof(*attr);
+
+   struct {
+   struct perf_event_attr *attr;
+   pid_t pid;
+   int cpu;
+   int group_fd;
+   unsigned long flags;
+   const char *flags_str;
+   } args[] = {
+   { NULL, 0xfacef00d, 0xbadabba7, -1,
+   (unsigned long)0xLLU,
+   "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
+   "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC|"
+   "0x" LONG_STR_PREFIX "fff0"
+   },
+   { attr + 1, 0,  0,  0,
+   0, "0" },
+   { attr, -1, -1, 1,
+   PERF_FLAG_FD_CLOEXEC, "PERF_FLAG_FD_CLOEXEC" },
+   { attr - 1, -100,   100,0xface1e55,
+   PERF_FLAG_FD_NO_GROUP | PERF_FLAG_FD_OUTPUT |
+   PERF_FLAG_PID_CGROUP | PERF_FLAG_FD_CLOEXEC,
+   "PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
+   "PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC" },
+   };
+   size_t i;
+   int rc;
+
+   for (i = 0; i < ARRAY_SIZE(args); i++) {
+   rc = syscall(__NR_perf_event_open, args[i].attr, args[i].pid,
+   args[i].cpu, args[i].group_fd, args[i].flags);
+   printf("perf_event_open(%s, %d, %d, %d, %s) = %s\n",
+   printaddr(args[i].attr), args[i].pid, args[i].cpu,
+   args[i].group_fd, args[i].flags_str, sprintrc(rc));
+   }
+
+   puts("+++ exited with 0 +++");
+   return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_perf_event_open")
+
+#endif
+
diff --git a/tests/perf_event_open.test b/tests/perf_event_open.test
new file mode 100755
index 000..af3860a
--- /dev/null
+++ b/tests/perf_event_open.test
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# Check perf_event_open syscall decoding.
+
+. "${srcdir=.}/init.sh"
+run_strace_match_diff -a1
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 3/9] tests: Additional decoder tests in sched_xetscheduler

2016-09-04 Thread Eugene Syromyatnikov
Some additional syscall parser tests:
 * Incorrect (negative) PID in sched_getscheduler, sched_setscheduler
 * Incorrect address of sched_param structure.
 * Incorrect policy value.

* tests/sched_xetscheduler.c: additional tests.
---
 tests/sched_xetscheduler.c |   19 +++
 1 file changed, 19 insertions(+)

diff --git a/tests/sched_xetscheduler.c b/tests/sched_xetscheduler.c
index ffb3307..7faee8c 100644
--- a/tests/sched_xetscheduler.c
+++ b/tests/sched_xetscheduler.c
@@ -46,7 +46,26 @@ main(void)
printf("sched_getscheduler(0) = %ld (%s)\n",
   rc, scheduler);
 
+   rc = syscall(__NR_sched_getscheduler, -1);
+   printf("sched_getscheduler(-1) = %s\n", sprintrc(rc));
+
param->sched_priority = -1;
+
+   rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, NULL);
+   printf("sched_setscheduler(0, SCHED_FIFO, NULL) = %s\n", sprintrc(rc));
+
+   rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param + 1);
+   printf("sched_setscheduler(0, SCHED_FIFO, %p) = %s\n", param + 1,
+  sprintrc(rc));
+
+   rc = syscall(__NR_sched_setscheduler, 0, 0xfaceda7a, param);
+   printf("sched_setscheduler(0, %#x /* SCHED_??? */, [%d]) = %s\n",
+  0xfaceda7a, param->sched_priority, sprintrc(rc));
+
+   rc = syscall(__NR_sched_setscheduler, -1, SCHED_FIFO, param);
+   printf("sched_setscheduler(-1, SCHED_FIFO, [%d]) = %s\n",
+  param->sched_priority, sprintrc(rc));
+
rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param);
printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %s\n",
   param->sched_priority, sprintrc(rc));
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 4/9] tests: Use sprintrc for return code output in sched_rr_get_interval test

2016-09-04 Thread Eugene Syromyatnikov
* tests/sched_rr_get_interval.c: Use sprintrc for return code output.
---
 tests/sched_rr_get_interval.c |3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tests/sched_rr_get_interval.c b/tests/sched_rr_get_interval.c
index 8501346..73e2d39 100644
--- a/tests/sched_rr_get_interval.c
+++ b/tests/sched_rr_get_interval.c
@@ -12,8 +12,7 @@ main(void)
 {
struct timespec *const tp = tail_alloc(sizeof(struct timespec));
long rc = syscall(__NR_sched_rr_get_interval, -1, tp);
-   printf("sched_rr_get_interval(-1, %p) = %ld %s (%m)\n",
-  tp, rc, errno2name());
+   printf("sched_rr_get_interval(-1, %p) = %s\n", sprintrc(rc));
 
puts("+++ exited with 0 +++");
return 0;
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 5/9] tests: Additional decoder tests in sched_rr_get_interval

2016-09-04 Thread Eugene Syromyatnikov
Some additional syscall parser tests:
 * Incorrect timespec pointer.
 * Successful call.

* tests/sched_rr_get_interval.c: Additional tests.
---
 tests/sched_rr_get_interval.c |   21 +++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/tests/sched_rr_get_interval.c b/tests/sched_rr_get_interval.c
index 73e2d39..99943e7 100644
--- a/tests/sched_rr_get_interval.c
+++ b/tests/sched_rr_get_interval.c
@@ -3,6 +3,7 @@
 
 #ifdef __NR_sched_rr_get_interval
 
+# include 
 # include 
 # include 
 # include 
@@ -11,8 +12,24 @@ int
 main(void)
 {
struct timespec *const tp = tail_alloc(sizeof(struct timespec));
-   long rc = syscall(__NR_sched_rr_get_interval, -1, tp);
-   printf("sched_rr_get_interval(-1, %p) = %s\n", sprintrc(rc));
+   long rc;
+
+   rc = syscall(__NR_sched_rr_get_interval, 0, NULL);
+   printf("sched_rr_get_interval(0, NULL) = %s\n", sprintrc(rc));
+
+   rc = syscall(__NR_sched_rr_get_interval, 0, tp + 1);
+   printf("sched_rr_get_interval(0, %p) = %s\n", tp + 1, sprintrc(rc));
+
+   rc = syscall(__NR_sched_rr_get_interval, -1, tp);
+   printf("sched_rr_get_interval(-1, %p) = %s\n", tp, sprintrc(rc));
+
+   rc = syscall(__NR_sched_rr_get_interval, 0, tp);
+   if (rc == 0)
+   printf("sched_rr_get_interval(0, {%jd, %jd}) = 0\n",
+   (intmax_t)tp->tv_sec, (intmax_t)tp->tv_nsec);
+   else
+   printf("sched_rr_get_interval(-1, %p) = %s\n", tp,
+   sprintrc(rc));
 
puts("+++ exited with 0 +++");
return 0;
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 6/9] aio: Use printfd for fd printing

2016-09-04 Thread Eugene Syromyatnikov
struct iocb contains two fields with fd semantics: aio_fildes and
aio_resfd. It is quite reasonable to use appropriate function for
printing them (apart from just "%d").

* aio.c (print_common_flags): Add struct tcb pointer to parameter list;
  use printfd for printing aio_resfd field.
  (print_iocb_header): Add struct tcb pointer to parameter list; use
  printfd for printing aio_fildes field.
  (print_iocb): provide tcp argument to print_iocb_header and
  print_common_flags.
  (SYS_FUNC(io_cancel)): Likewise.
---
 aio.c |   21 -
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/aio.c b/aio.c
index 29562d2..7b908d4 100644
--- a/aio.c
+++ b/aio.c
@@ -78,12 +78,14 @@ tprint_lio_opcode(unsigned cmd)
 }
 
 static void
-print_common_flags(const struct iocb *cb)
+print_common_flags(struct tcb *tcp, const struct iocb *cb)
 {
 /* IOCB_FLAG_RESFD is available since v2.6.22-rc1~47 */
 #ifdef IOCB_FLAG_RESFD
-   if (cb->aio_flags & IOCB_FLAG_RESFD)
-   tprintf(", resfd=%d", cb->aio_resfd);
+   if (cb->aio_flags & IOCB_FLAG_RESFD) {
+   tprints(", resfd=");
+   printfd(tcp, cb->aio_resfd);
+   }
if (cb->aio_flags & ~IOCB_FLAG_RESFD)
tprintf(", flags=%x", cb->aio_flags);
 #endif
@@ -98,7 +100,7 @@ iocb_is_valid(const struct iocb *cb)
 }
 
 static enum iocb_sub
-print_iocb_header(const struct iocb *cb)
+print_iocb_header(struct tcb *tcp, const struct iocb *cb)
 {
enum iocb_sub sub;
 
@@ -113,7 +115,8 @@ print_iocb_header(const struct iocb *cb)
if (cb->aio_reqprio)
tprintf(", reqprio=%hd", cb->aio_reqprio);
 
-   tprintf(", fildes=%d", cb->aio_fildes);
+   tprints(", fildes=");
+   printfd(tcp, cb->aio_fildes);
 
return sub;
 }
@@ -121,7 +124,7 @@ print_iocb_header(const struct iocb *cb)
 static void
 print_iocb(struct tcb *tcp, const struct iocb *cb)
 {
-   enum iocb_sub sub = print_iocb_header(cb);
+   enum iocb_sub sub = print_iocb_header(tcp, cb);
 
switch (sub) {
case SUB_COMMON:
@@ -134,7 +137,7 @@ print_iocb(struct tcb *tcp, const struct iocb *cb)
}
tprintf(", nbytes=%" PRIu64 ", offset=%" PRId64,
(uint64_t) cb->aio_nbytes, (int64_t) cb->aio_offset);
-   print_common_flags(cb);
+   print_common_flags(tcp, cb);
break;
case SUB_VECTOR:
if (iocb_is_valid(cb)) {
@@ -149,7 +152,7 @@ print_iocb(struct tcb *tcp, const struct iocb *cb)
(uint64_t) cb->aio_nbytes);
}
tprintf(", offset=%" PRId64, (int64_t) cb->aio_offset);
-   print_common_flags(cb);
+   print_common_flags(tcp, cb);
break;
case SUB_NONE:
break;
@@ -214,7 +217,7 @@ SYS_FUNC(io_cancel)
 
if (!umove_or_printaddr(tcp, tcp->u_arg[1], &cb)) {
tprints("{");
-   print_iocb_header(&cb);
+   print_iocb_header(tcp, &cb);
tprints("}");
}
tprints(", ");
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 9/9] tests: Some additional aio checks

2016-09-04 Thread Eugene Syromyatnikov
* aio.c: Additional checks added.
---
 tests/aio.c |  108 +++
 1 file changed, 108 insertions(+)

diff --git a/tests/aio.c b/tests/aio.c
index 8c5bfa7..00de5ae 100644
--- a/tests/aio.c
+++ b/tests/aio.c
@@ -111,6 +111,33 @@ main(void)
};
const struct iocb *cbv = tail_memdup(proto_cbv, sizeof(proto_cbv));
 
+   /* For additional decoder testing */
+   const struct iocb proto_cbv2[] = {
+   {
+   .aio_data = 0xbadfacedc0ffeeed,
+   .aio_key = 0xdefaced0,
+   .aio_lio_opcode = 0xf00d,
+   .aio_reqprio = 0xbeef,
+   .aio_fildes = 0xdefaced1,
+   .aio_buf = 0,
+   },
+   {
+   .aio_data = 0xbadfacedc0ffeeed,
+   .aio_key = 0xdefaced0,
+   .aio_lio_opcode = 1,
+   .aio_reqprio = 0xbeef,
+   .aio_fildes = 0xdefaced1,
+   .aio_buf = 0,
+   .aio_nbytes = 0x1020304050607080,
+   .aio_offset = 0xdeadda7abadc0ded,
+# ifdef IOCB_FLAG_RESFD
+   .aio_flags = 0xfacef157,
+   .aio_resfd = 0xded1ca7e,
+# endif
+   },
+   };
+   const struct iocb *cbv2 = tail_memdup(proto_cbv2, sizeof(proto_cbv2));
+
const struct iocb proto_cbc = {
.aio_data = 0xdeadbeefbadc0ded,
.aio_reqprio = 99,
@@ -128,6 +155,11 @@ main(void)
};
const long *cbvs = tail_memdup(proto_cbvs, sizeof(proto_cbvs));
 
+   const long proto_cbvs2[] = {
+   (long) &cbv2[0], (long) &cbv2[1],
+   };
+   const long *cbvs2 = tail_memdup(proto_cbvs2, sizeof(proto_cbvs2));
+
unsigned long *ctx = tail_alloc(sizeof(unsigned long));
*ctx = 0;
 
@@ -142,10 +174,26 @@ main(void)
if (open("/dev/zero", O_RDONLY))
perror_msg_and_skip("open: %s", "/dev/zero");
 
+   assert(syscall(__NR_io_setup, 0xdeadbeef, NULL) == -1);
+   printf("io_setup(%u, NULL) = %s\n", 0xdeadbeef, sprintrc(-1));
+
+   assert(syscall(__NR_io_setup, lnr, ctx + 1) == -1);
+   printf("io_setup(%u, %p) = %s\n", nr, ctx + 1, sprintrc(-1));
+
if (syscall(__NR_io_setup, lnr, ctx))
perror_msg_and_skip("io_setup");
printf("io_setup(%u, [%lu]) = 0\n", nr, *ctx);
 
+   assert(syscall(__NR_io_submit, (aio_context_t) 0xface1e55deadbeef,
+  (long) 0xca7faceddeadf00d, NULL) == -1);
+   printf("io_submit(%lu, %ld, NULL) = %s\n",
+  (aio_context_t) 0xface1e55deadbeef, (long) 0xca7faceddeadf00d,
+  sprintrc(-1));
+
+   assert(syscall(__NR_io_submit, *ctx, nr, cbs + nr) == -1);
+   printf("io_submit(%lu, %u, %p) = %s\n",
+  *ctx, nr, cbs + nr, sprintrc(-1));
+
assert(syscall(__NR_io_submit, *ctx, -1L, cbs) == -1);
printf("io_submit(%lu, -1, %p) = %s\n",
   *ctx, cbs, sprintrc(-1));
@@ -165,6 +213,22 @@ main(void)
   sizeof_data1, (long long) cb[1].aio_offset,
   nr);
 
+   assert(syscall(__NR_io_getevents, (aio_context_t) 0xface1e55deadbeef,
+  (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, ev + 1,
+  NULL) == -1);
+   printf("io_getevents(%lu, %ld, %ld, %p, NULL) = %s\n",
+  (aio_context_t) 0xface1e55deadbeef,
+  (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0,
+  ev + 1, sprintrc(-1));
+
+   assert(syscall(__NR_io_getevents, (aio_context_t) 0xface1e55deadbeef,
+  (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0, NULL,
+  ts + 1) == -1);
+   printf("io_getevents(%lu, %ld, %ld, NULL, %p) = %s\n",
+  (aio_context_t) 0xface1e55deadbeef,
+  (long) 0xca7faceddeadf00d, (long) 0xba5e1e505ca571e0,
+  ts + 1, sprintrc(-1));
+
assert(syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts) == (long) 
nr);
printf("io_getevents(%lu, %ld, %ld, ["
"{data=%#llx, obj=%p, res=%u, res2=0}, "
@@ -175,11 +239,50 @@ main(void)
   (unsigned long long) cb[1].aio_data, &cb[1], sizeof_data1,
   nr);
 
+   assert(syscall(__NR_io_cancel, *ctx, NULL, NULL) == -1);
+   printf("io_cancel(%lu, NULL, NULL) = %s\n", *ctx, sprintrc(-1));
+
+   assert(syscall(__NR_io_cancel, *ctx, cbc + 1, ev) == -1);
+   printf("io_cancel(%lu, %p, %p) = %s\n", *ctx, cbc + 1, ev,
+  sprintrc(-1));
+
assert(syscall(__NR_io_cancel, *ctx, cbc, ev) == -1);
printf("io_cancel(%lu, {data=%#llx, pread, reqprio=99, fildes=-42}, %p) 
"
   "= %s\n",
   *ctx, (unsigned long long) cbc->aio_data, ev, sprintrc(-1));
 
+   assert(syscall(__NR_io_submit, (unsigned long)0xfacef157beeff00dULL,
+  

[PATCH 7/9] tests: Use sprintrc for return code output in aio test

2016-09-04 Thread Eugene Syromyatnikov
* tests/aio.c: Use sprintrc for return code output.
---
 tests/aio.c |8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tests/aio.c b/tests/aio.c
index a6a3b9c..5a023cf 100644
--- a/tests/aio.c
+++ b/tests/aio.c
@@ -147,8 +147,8 @@ main(void)
printf("io_setup(%u, [%lu]) = 0\n", nr, *ctx);
 
assert(syscall(__NR_io_submit, *ctx, -1L, cbs) == -1);
-   printf("io_submit(%lu, -1, %p) = -1 %s (%m)\n",
-  *ctx, cbs, errno2name());
+   printf("io_submit(%lu, -1, %p) = %s\n",
+  *ctx, cbs, sprintrc(-1));
 
if (syscall(__NR_io_submit, *ctx, nr, cbs) != (long) nr)
perror_msg_and_skip("io_submit");
@@ -177,8 +177,8 @@ main(void)
 
assert(syscall(__NR_io_cancel, *ctx, cbc, ev) == -1);
printf("io_cancel(%lu, {data=%#llx, pread, reqprio=99, fildes=-42}, %p) 
"
-   "= -1 %s (%m)\n",
-  *ctx, (unsigned long long) cbc->aio_data, ev, errno2name());
+  "= %s\n",
+  *ctx, (unsigned long long) cbc->aio_data, ev, sprintrc(-1));
 
if (syscall(__NR_io_submit, *ctx, nr, cbvs) != (long) nr)
perror_msg_and_skip("io_submit");
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 2/9] tests: Use sprintrc for return code output in sched_xetscheduler test

2016-09-04 Thread Eugene Syromyatnikov
* tests/sched_xetscheduler.c: Use sprintrc for return code output.
---
 tests/sched_xetscheduler.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/sched_xetscheduler.c b/tests/sched_xetscheduler.c
index d3b7759..ffb3307 100644
--- a/tests/sched_xetscheduler.c
+++ b/tests/sched_xetscheduler.c
@@ -48,8 +48,8 @@ main(void)
 
param->sched_priority = -1;
rc = syscall(__NR_sched_setscheduler, 0, SCHED_FIFO, param);
-   printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %ld %s (%m)\n",
-  param->sched_priority, rc, errno2name());
+   printf("sched_setscheduler(0, SCHED_FIFO, [%d]) = %s\n",
+  param->sched_priority, sprintrc(rc));
 
puts("+++ exited with 0 +++");
return 0;
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


[PATCH 8/9] tests: min_nr and nr arguments in io_getevents should be long

2016-09-04 Thread Eugene Syromyatnikov
* aio.c (main): change output format for min_nr and nr arguments in
  io_getevents check to %ld, cast arguments to long.
---
 tests/aio.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/aio.c b/tests/aio.c
index 5a023cf..8c5bfa7 100644
--- a/tests/aio.c
+++ b/tests/aio.c
@@ -166,11 +166,11 @@ main(void)
   nr);
 
assert(syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts) == (long) 
nr);
-   printf("io_getevents(%lu, %u, %u, ["
+   printf("io_getevents(%lu, %ld, %ld, ["
"{data=%#llx, obj=%p, res=%u, res2=0}, "
"{data=%#llx, obj=%p, res=%u, res2=0}"
"], {0, 123456789}) = %u\n",
-  *ctx, nr, nr + 1,
+  *ctx, (long) nr, (long) (nr + 1),
   (unsigned long long) cb[0].aio_data, &cb[0], sizeof_data0,
   (unsigned long long) cb[1].aio_data, &cb[1], sizeof_data1,
   nr);
-- 
1.7.10.4


--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel