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