]> granicus.if.org Git - strace/commitdiff
eventfd2: fix flags decoding
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 1 Aug 2015 21:08:13 +0000 (21:08 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 1 Aug 2015 22:23:58 +0000 (22:23 +0000)
* configure.ac (AC_CHECK_HEADERS): Add sys/eventfd.h.
* eventfd.c: Include <fcntl.h>.
[HAVE_SYS_EVENTFD_H] Include <sys/eventfd.h>.
Include "xlat/efd_flags.h".
(do_eventfd): Use efd_flags for flags decoding.
* xlat/efd_flags.in: New file.
* tests/eventfd.c: New file.
* tests/eventfd.expected: Likewise.
* tests/eventfd.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add eventfd.
(TESTS): Add eventfd.test.
(EXTRA_DIST): Add eventfd.expected.
* tests/.gitignore: Add eventfd.

configure.ac
eventfd.c
tests/.gitignore
tests/Makefile.am
tests/eventfd.c [new file with mode: 0644]
tests/eventfd.expected [new file with mode: 0644]
tests/eventfd.test [new file with mode: 0755]
xlat/efd_flags.in [new file with mode: 0644]

index aa0703c1991cc5b794d01201693ee0bcfe8f8bd0..8c7e8264246b7bac76293cba3a14a6d7d88f1e37 100644 (file)
@@ -268,6 +268,7 @@ AC_CHECK_HEADERS(m4_normalize([
        stropts.h
        sys/conf.h
        sys/epoll.h
+       sys/eventfd.h
        sys/fanotify.h
        sys/ioctl.h
        sys/reg.h
index 0e22c2b747d138a2e74c4412dc6efe76abcdceee..0f899461d6237499809a64cf67f34aa5cc5e1080 100644 (file)
--- a/eventfd.c
+++ b/eventfd.c
@@ -1,4 +1,10 @@
 #include "defs.h"
+#include <fcntl.h>
+#ifdef HAVE_SYS_EVENTFD_H
+# include <sys/eventfd.h>
+#endif
+
+#include "xlat/efd_flags.h"
 
 static int
 do_eventfd(struct tcb *tcp, int flags_arg)
@@ -6,7 +12,7 @@ do_eventfd(struct tcb *tcp, int flags_arg)
        tprintf("%u", (unsigned int) tcp->u_arg[0]);
        if (flags_arg >= 0) {
                tprints(", ");
-               printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
+               printflags(efd_flags, tcp->u_arg[flags_arg], "EFD_???");
        }
 
        return RVAL_DECODED | RVAL_FD;
index f951246092a2937e3ecc5a634925a019f6d5b53a..9b73a955ea3d28b7dd9a95512105deaba199d222 100644 (file)
@@ -1,5 +1,6 @@
 bpf
 caps
+eventfd
 execve
 execveat
 fanotify_mark
index a94881c0e5ac66ffe918c61c3bc8a17fe9f9da94..dc76ddda91141789acd76ad48f5144ad054be59d 100644 (file)
@@ -11,6 +11,7 @@ AM_CPPFLAGS = -I$(top_builddir)/$(OS)/$(ARCH) \
 check_PROGRAMS = \
        bpf \
        caps \
+       eventfd \
        execve \
        execveat \
        fanotify_mark \
@@ -71,6 +72,7 @@ TESTS = \
        bpf.test \
        caps.test \
        dumpio.test \
+       eventfd.test \
        execve.test \
        execveat.test \
        fanotify_mark.test \
@@ -129,6 +131,7 @@ AM_TEST_LOG_FLAGS = STRACE_ARCH=$(ARCH) $(srcdir)/run.sh
 EXTRA_DIST = init.sh run.sh match.awk \
             caps.awk \
             dumpio.expected \
+            eventfd.expected \
             execve.expected \
             execve-v.expected \
             execveat.expected \
diff --git a/tests/eventfd.c b/tests/eventfd.c
new file mode 100644 (file)
index 0000000..07a0b10
--- /dev/null
@@ -0,0 +1,19 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+int
+main(void)
+{
+#ifdef __NR_eventfd2
+       (void) close(0);
+       return syscall(__NR_eventfd2, -1L, 1 | O_CLOEXEC | O_NONBLOCK) == 0 ?
+               0 : 77;
+#else
+        return 77;
+#endif
+}
diff --git a/tests/eventfd.expected b/tests/eventfd.expected
new file mode 100644 (file)
index 0000000..c4b45a0
--- /dev/null
@@ -0,0 +1,2 @@
+eventfd2(4294967295, EFD_SEMAPHORE|EFD_CLOEXEC|EFD_NONBLOCK) = 0
++++ exited with 0 +++
diff --git a/tests/eventfd.test b/tests/eventfd.test
new file mode 100755 (executable)
index 0000000..e181ed6
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Check eventfd2 syscall decoding.
+
+. "${srcdir=.}/init.sh"
+
+run_prog
+run_strace -e eventfd2 $args
+match_diff
+
+exit 0
diff --git a/xlat/efd_flags.in b/xlat/efd_flags.in
new file mode 100644 (file)
index 0000000..0db0ade
--- /dev/null
@@ -0,0 +1,3 @@
+EFD_SEMAPHORE  1
+EFD_CLOEXEC    O_CLOEXEC
+EFD_NONBLOCK   O_NONBLOCK