* tests/ioctl_binder.c: New file.
* tests/ioctl_binder.tests: New test.
* tests/.gitignore: Add ioctl_binder.
* tests/Makefile.am (check_PROGRAMS): Add Likewise.

Signed-off-by: Antoine Damhet <antoine.dam...@lse.epita.fr>
---
 tests/.gitignore        |   1 +
 tests/Makefile.am       |   2 +
 tests/ioctl_binder.c    | 103 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/ioctl_binder.test |  15 +++++++
 4 files changed, 121 insertions(+)
 create mode 100644 tests/ioctl_binder.c
 create mode 100755 tests/ioctl_binder.test

diff --git a/tests/.gitignore b/tests/.gitignore
index 72e93d8..bdfdf53 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -98,6 +98,7 @@ ioctl_evdev-v
 ioctl_mtd
 ioctl_rtc
 ioctl_rtc-v
+ioctl_binder
 ioctl_uffdio
 ioctl_v4l2
 ioperm
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 94d3d23..033f431 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -148,6 +148,7 @@ check_PROGRAMS = \
        getxxid \
        inet-cmsg \
        ioctl \
+       ioctl_binder \
        ioctl_block \
        ioctl_evdev \
        ioctl_evdev-v \
@@ -466,6 +467,7 @@ DECODER_TESTS = \
        ioctl_mtd.test \
        ioctl_rtc.test \
        ioctl_rtc-v.test \
+       ioctl_binder.test \
        ioctl_uffdio.test \
        ioctl_v4l2.test \
        ioperm.test \
diff --git a/tests/ioctl_binder.c b/tests/ioctl_binder.c
new file mode 100644
index 0000000..8ad09bf
--- /dev/null
+++ b/tests/ioctl_binder.c
@@ -0,0 +1,103 @@
+#include "tests.h"
+
+#if defined(HAVE_LINUX_ANDROID_BINDER_H) || defined(__ANDROID__)
+
+# include <sys/ioctl.h>
+# include <linux/ioctl.h>
+# include <stdio.h>
+# include <inttypes.h>
+# include <stdlib.h>
+
+# if SIZEOF_LONG == 4
+#  define BINDER_IPC_32BIT
+# endif
+# ifdef HAVE_LINUX_ANDROID_BINDER_H
+#  include <linux/android/binder.h>
+# else
+#  include <linux/binder.h>
+# endif
+
+int
+main(void)
+{
+       /* All the tests are performed without the driver */
+       int32_t snbr = 12;
+       ioctl(-1, BINDER_SET_IDLE_PRIORITY, &snbr);
+       printf("ioctl(-1, BINDER_SET_IDLE_PRIORITY, [%" PRId32 "]) = "
+                       "-1 EBADF (Bad file descriptor)\n", snbr);
+
+       snbr = -125;
+       ioctl(-1, BINDER_SET_CONTEXT_MGR, &snbr);
+       printf("ioctl(-1, BINDER_SET_CONTEXT_MGR, [%" PRId32 "]) = "
+                       "-1 EBADF (Bad file descriptor)\n", snbr);
+
+       snbr = 42;
+       ioctl(-1, BINDER_THREAD_EXIT, &snbr);
+       printf("ioctl(-1, BINDER_THREAD_EXIT, [%" PRId32 "]) = "
+                       "-1 EBADF (Bad file descriptor)\n", snbr);
+
+       uint32_t unbr = 172;
+       ioctl(-1, BINDER_SET_MAX_THREADS, &unbr);
+       printf("ioctl(-1, BINDER_SET_MAX_THREADS, [%" PRIu32 "]) = "
+                       "-1 EBADF (Bad file descriptor)\n", unbr);
+
+       int64_t bnbr = 123456789;
+       ioctl(-1, BINDER_SET_IDLE_TIMEOUT, &bnbr);
+       printf("ioctl(-1, BINDER_SET_IDLE_TIMEOUT, [%" PRIu64 "]) = "
+                       "-1 EBADF (Bad file descriptor)\n", bnbr);
+
+
+       struct binder_write_read wr = { 0 };
+       wr.write_size = 2 * sizeof(uint32_t)
+               + sizeof(struct binder_transaction_data);
+       uint32_t *buf = malloc(wr.write_size);
+       if (!buf)
+               perror_msg_and_skip("Failed malloc");
+
+       wr.write_buffer = (binder_uintptr_t)buf;
+       wr.read_size = 256;
+       wr.read_consumed = 15;
+       wr.write_consumed = 0;
+
+       buf[0] = BC_ENTER_LOOPER;
+       buf[1] = BC_TRANSACTION;
+       struct binder_transaction_data *tr = (void *)(buf + 2);
+       tr->target.handle = 42;
+       tr->cookie = 27;
+       tr->code = 99;
+       tr->sender_pid = 1000;
+       tr->sender_euid = 1500;
+       tr->data_size = 0;
+       tr->offsets_size = 0;
+       tr->data.ptr.buffer = 0;
+       tr->data.ptr.offsets = 0;
+
+       ioctl(-1, BINDER_WRITE_READ, &wr);
+       printf("ioctl(-1, BINDER_WRITE_READ, {write_size=%" PRIu64
+                       ", write_consumed=%" PRIu64 ", write_buffer=[",
+                       (uint64_t)wr.write_size, (uint64_t)wr.write_consumed);
+
+       printf("BC_ENTER_LOOPER, [BC_TRANSACTION, {{handle=%" PRIu32
+                       "}, cookie=0x%" PRIx64 ", code=%" PRIu32
+                       ", flags=0, sender_pid=%d, sender_euid=%d, data_size=%"
+                       PRIu64 ", offsets_size=%" PRIu64 ", data=[NULL]}]",
+                       tr->target.handle, (uint64_t)tr->cookie, tr->code,
+                       tr->sender_pid, tr->sender_euid,
+                       (uint64_t)tr->data_size, (uint64_t)tr->offsets_size);
+
+       printf("], read_size=%" PRIu64 ", read_consumed=%" PRIu64
+                       "}) = -1 EBADF (Bad file descriptor)\n",
+                       (uint64_t)wr.read_size, (uint64_t)wr.read_consumed);
+
+       free(buf);
+
+       puts("+++ exited with 0 +++");
+
+       return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("HAVE_LINUX_ANDROID_BINDER_H) || __ANDROID__")
+
+#endif
diff --git a/tests/ioctl_binder.test b/tests/ioctl_binder.test
new file mode 100755
index 0000000..4ed3cce
--- /dev/null
+++ b/tests/ioctl_binder.test
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# Check binder's ioctl decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog > /dev/null
+run_strace -a16 -v -eioctl $args > "$EXP"
+check_prog grep
+grep -v '^ioctl([012],' < "$LOG" > "$OUT"
+match_diff "$OUT" "$EXP"
+
+rm -f "$EXP" "$OUT"
+
+exit 0
-- 
2.8.3


------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity planning
reports. http://sdm.link/zohomanageengine
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to