[PATCH v2] Add clone-f test

Fei Jie feij.fnst at cn.fujitsu.com
Tue Jan 26 05:50:44 UTC 2016


Check how clone syscall is traced.

* tests/clone-f.c: New file.
* tests/clone-f.test: New test.
* tests/Makefile.am: (check_PROGRAMS): Add clone-f.
(TESTS): Add clone-f.test.
* tests/.gitignore: Add clone-f.
---
 tests/.gitignore   |  1 +
 tests/Makefile.am  |  2 ++
 tests/clone-f.c    | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/clone-f.test | 13 +++++++++++
 4 files changed, 84 insertions(+)
 create mode 100644 tests/clone-f.c
 create mode 100755 tests/clone-f.test

diff --git a/tests/.gitignore b/tests/.gitignore
index 207a9b2..e8d7a4c 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -14,6 +14,7 @@ bpf
 caps
 clock_nanosleep
 clock_xettime
+clone-f
 epoll_create1
 eventfd
 execve
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f634583..883498a 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -62,6 +62,7 @@ check_PROGRAMS = \
 	caps \
 	clock_nanosleep \
 	clock_xettime \
+	clone-f \
 	epoll_create1 \
 	eventfd \
 	execve \
@@ -202,6 +203,7 @@ TESTS = \
 	caps.test \
 	clock_nanosleep.test \
 	clock_xettime.test \
+	clone-f.test \
 	dumpio.test \
 	epoll_create1.test \
 	eventfd.test \
diff --git a/tests/clone-f.c b/tests/clone-f.c
new file mode 100644
index 0000000..5407349
--- /dev/null
+++ b/tests/clone-f.c
@@ -0,0 +1,68 @@
+#include "tests.h"
+#include <assert.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#define CHILD_STACK_SIZE 16384
+
+#if defined (__s390__) || (__s390x__)
+#define clone __clone
+extern int __clone(int(void*),void*,int,void*);
+#elif defined(__ia64__)
+#define clone2 __clone2
+extern int  __clone2(int (*fn) (void *arg), void *child_stack_base,
+        size_t child_stack_size, int flags, void *arg,
+        pid_t *parent_tid, void *tls, pid_t *child_tid);
+#endif
+
+static inline int
+logit_(const char *const str)
+{
+	return !chdir(str);
+}
+
+#define prefix "clone-f."
+#define logit(arg) logit_(prefix arg)
+
+int
+child()
+{
+	logit("child");
+	return 0;
+}
+
+int main()
+{
+	void *child_stack;
+	if ((child_stack = (void *) malloc(CHILD_STACK_SIZE)) == NULL) {
+		perror_msg_and_fail("cannot allocate stack for child!");
+	}
+
+	pid_t child_pid;
+#if defined(__hppa__)
+	child_pid = clone(&child, child_stack, SIGCHLD, NULL);
+#elif defined(__ia64__)
+	child_pid = clone2(&child, child_stack, CHILD_STACK_SIZE, SIGCHLD, NULL,
+	       NULL, NULL, NULL);
+#else
+	child_pid = clone(&child, child_stack + CHILD_STACK_SIZE, SIGCHLD, NULL);
+#endif
+	int status;
+	assert(wait(&status) == child_pid);
+	assert(status == 0);
+
+	free (child_stack);
+
+	logit("parent");
+
+	pid_t pid = getpid();
+	printf("%-5d chdir(\"%schild\") = -1 ENOENT (%m)\n"
+	       "%-5d chdir(\"%sparent\") = -1 ENOENT (%m)\n",
+	       child_pid, prefix,
+	       pid, prefix);
+	return 0;
+}
diff --git a/tests/clone-f.test b/tests/clone-f.test
new file mode 100755
index 0000000..20840de
--- /dev/null
+++ b/tests/clone-f.test
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# Check how clone syscall is traced.
+
+. "${srcdir=.}/init.sh"
+
+OUT="$LOG.out"
+run_prog > /dev/null
+run_strace -a29 -echdir -esignal=none -f -qq $args >"$OUT"
+match_diff "$LOG" "$OUT"
+rm -f "$OUT"
+
+exit 0
-- 
1.8.3.1







More information about the Strace-devel mailing list