Module Name: src
Committed By: kamil
Date: Sat May 19 05:04:09 UTC 2018
Modified Files:
src/tests/lib/libc/sys: t_ptrace_wait.h
Log Message:
Add new auxiliary functions in t_ptrace_wait.h
New functions:
- FORKEE_ASSERT_NEQ()
- await_stopped_child()
Both will be used soon in a new ATF ptrace(2) test.
Sponsored by <The NetBSD Foundation>
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libc/sys/t_ptrace_wait.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/lib/libc/sys/t_ptrace_wait.h
diff -u src/tests/lib/libc/sys/t_ptrace_wait.h:1.4 src/tests/lib/libc/sys/t_ptrace_wait.h:1.5
--- src/tests/lib/libc/sys/t_ptrace_wait.h:1.4 Sun May 13 23:01:25 2018
+++ src/tests/lib/libc/sys/t_ptrace_wait.h Sat May 19 05:04:09 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.h,v 1.4 2018/05/13 23:01:25 kamil Exp $ */
+/* $NetBSD: t_ptrace_wait.h,v 1.5 2018/05/19 05:04:09 kamil Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -153,6 +153,17 @@ do { \
#x, vx, #y, vy); \
} while (/*CONSTCOND*/0)
+#define FORKEE_ASSERT_NEQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx != vy; \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
+ "%s(%ju) != %s(%ju)", __FILE__, __LINE__, __func__, \
+ #x, vx, #y, vy); \
+} while (/*CONSTCOND*/0)
+
#define FORKEE_ASSERTX(x) \
do { \
int ret = (x); \
@@ -364,6 +375,61 @@ await_zombie(pid_t process)
await_zombie_raw(process, 1000);
}
+static pid_t __used
+await_stopped_child(pid_t process)
+{
+ struct kinfo_proc2 *p = NULL;
+ size_t i, len;
+ pid_t child = -1;
+
+ int name[] = {
+ [0] = CTL_KERN,
+ [1] = KERN_PROC2,
+ [2] = KERN_PROC_ALL,
+ [3] = 0,
+ [4] = sizeof(struct kinfo_proc2),
+ [5] = 0
+ };
+
+ const size_t namelen = __arraycount(name);
+
+ /* Await the process becoming a zombie */
+ while(1) {
+ name[5] = 0;
+
+ FORKEE_ASSERT_EQ(sysctl(name, namelen, 0, &len, NULL, 0), 0);
+
+ FORKEE_ASSERT_EQ(reallocarr(&p,
+ len,
+ sizeof(struct kinfo_proc2)), 0);
+
+ name[5] = len;
+
+ FORKEE_ASSERT_EQ(sysctl(name, namelen, p, &len, NULL, 0), 0);
+
+ for (i = 0; i < len/sizeof(struct kinfo_proc2); i++) {
+ if (p[i].p_pid == getpid())
+ continue;
+ if (p[i].p_ppid != process)
+ continue;
+ if (p[i].p_stat != LSSTOP)
+ continue;
+ child = p[i].p_pid;
+ break;
+ }
+
+ if (child != -1)
+ break;
+
+ FORKEE_ASSERT_EQ(usleep(1000), 0);
+ }
+
+ /* Free the buffer */
+ FORKEE_ASSERT_EQ(reallocarr(&p, 0, sizeof(struct kinfo_proc2)), 0);
+
+ return child;
+}
+
/* Happy number sequence -- this function is used to just consume cpu cycles */
#define HAPPY_NUMBER 1