Module Name:    src
Committed By:   christos
Date:           Mon Dec  5 20:10:10 UTC 2016

Modified Files:
        src/tests/kernel: t_ptrace_wait.c t_ptrace_wait.h
Added Files:
        src/tests/kernel: msg.h

Log Message:
- abstract the pipe calls into routines.
- some of the tests that worked (really failed silently before) now fail.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1 src/tests/kernel/msg.h
cvs rdiff -u -r1.40 -r1.41 src/tests/kernel/t_ptrace_wait.c
cvs rdiff -u -r1.1 -r1.2 src/tests/kernel/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/kernel/t_ptrace_wait.c
diff -u src/tests/kernel/t_ptrace_wait.c:1.40 src/tests/kernel/t_ptrace_wait.c:1.41
--- src/tests/kernel/t_ptrace_wait.c:1.40	Mon Dec  5 02:18:10 2016
+++ src/tests/kernel/t_ptrace_wait.c	Mon Dec  5 15:10:10 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ptrace_wait.c,v 1.40 2016/12/05 07:18:10 kamil Exp $	*/
+/*	$NetBSD: t_ptrace_wait.c,v 1.41 2016/12/05 20:10:10 christos Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_wait.c,v 1.40 2016/12/05 07:18:10 kamil Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.41 2016/12/05 20:10:10 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -51,6 +51,20 @@ __RCSID("$NetBSD: t_ptrace_wait.c,v 1.40
 #include "../h_macros.h"
 
 #include "t_ptrace_wait.h"
+#include "msg.h"
+// #define atf_utils_fork() fork()
+
+#define PARENT_TO_CHILD(info, fds, msg) \
+    ATF_REQUIRE(msg_write_child(info " to child " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define CHILD_FROM_PARENT(info, fds, msg) \
+    FORKEE_ASSERT(msg_read_parent(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define CHILD_TO_PARENT(info, fds, msg) \
+    FORKEE_ASSERT(msg_write_parent(info " to parent " # fds, &fds, &msg, sizeof(msg)) == 0)
+
+#define PARENT_FROM_CHILD(info, fds, msg) \
+    ATF_REQUIRE(msg_read_child(info " from parent " # fds, &fds, &msg, sizeof(msg)) == 0)
 
 ATF_TC(traceme1);
 ATF_TC_HEAD(traceme1, tc)
@@ -285,8 +299,7 @@ ATF_TC_HEAD(attach1, tc)
 
 ATF_TC_BODY(attach1, tc)
 {
-	int fds_totracee[2], fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracee, parent_tracer;
 	const int exitval_tracee = 5;
 	const int exitval_tracer = 10;
 	pid_t tracee, tracer, wpid;
@@ -296,30 +309,18 @@ ATF_TC_BODY(attach1, tc)
 #endif
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-
-		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
+		CHILD_FROM_PARENT("message 1", parent_tracee, msg);
+		msg_close(&parent_tracee);
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
-		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		printf("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -333,47 +334,46 @@ ATF_TC_BODY(attach1, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
 
-		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
 
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
 		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
 
 		forkee_status_exited(status, exitval_tracee);
+		printf("Tracee %d exited with %d\n", tracee, exitval_tracee);
+
+		CHILD_TO_PARENT("Message 3", parent_tracer, msg);
 
 		printf("Before exiting of the tracer process\n");
+		msg_close(&parent_tracer);
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
 
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
 
 	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
+	PARENT_TO_CHILD("Message 1", parent_tracee,  msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
 
-	printf("Assert that there is no status about tracee - "
-	    "Tracer must detect zombie first - calling %s()\n", TWAIT_FNAME);
+	printf("Tell the tracer child should have exited\n");
+	PARENT_TO_CHILD("Message 2", parent_tracer,  msg);
+
+	printf("Wait from tracer child to complete waiting for tracee\n");
+	PARENT_FROM_CHILD("Message 3", parent_tracer, msg);
+	printf("Assert that there is no status about tracee %d - "
+	    "Tracer must detect zombie first - calling %s()\n", tracee,
+	    TWAIT_FNAME);
 	TWAIT_REQUIRE_SUCCESS(
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
 
 	printf("Wait for tracer to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -385,15 +385,12 @@ ATF_TC_BODY(attach1, tc)
 	printf("Wait for tracee to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
 	TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(tracee, &status, WNOHANG),
-	    tracee);
+	    0);
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracer);
+	msg_close(&parent_tracee);
 }
 #endif
 
@@ -408,8 +405,7 @@ ATF_TC_HEAD(attach2, tc)
 
 ATF_TC_BODY(attach2, tc)
 {
-	int fds_totracee[2], fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracer, parent_tracee;
 	const int exitval_tracee = 5;
 	const int exitval_tracer1 = 10, exitval_tracer2 = 20;
 	pid_t tracee, tracer, wpid;
@@ -419,30 +415,18 @@ ATF_TC_BODY(attach2, tc)
 #endif
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-
 		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
+		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
-		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		/* Fork again and drop parent to reattach to PID 1 */
 		tracer = atf_utils_fork();
 		if (tracer != 0)
@@ -461,12 +445,8 @@ ATF_TC_BODY(attach2, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
-		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
+		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
 
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
@@ -477,9 +457,6 @@ ATF_TC_BODY(attach2, tc)
 		printf("Before exiting of the tracer process\n");
 		_exit(exitval_tracer2);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
-
 	printf("Wait for the tracer process (direct child) to exit calling "
 	    "%s()\n", TWAIT_FNAME);
 	TWAIT_REQUIRE_SUCCESS(
@@ -493,15 +470,9 @@ ATF_TC_BODY(attach2, tc)
 	    wpid = TWAIT_GENERIC(tracee, NULL, WNOHANG), 0);
 
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
+	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
 	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
@@ -512,12 +483,7 @@ ATF_TC_BODY(attach2, tc)
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("Wait for tracer to exit (pipe broken expected)\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == 0);
+	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
 
 	printf("Wait for tracee to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -526,11 +492,9 @@ ATF_TC_BODY(attach2, tc)
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
+	msg_close(&parent_tracer);
+	msg_close(&parent_tracee);
 
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
 }
 #endif
 
@@ -543,8 +507,7 @@ ATF_TC_HEAD(attach3, tc)
 
 ATF_TC_BODY(attach3, tc)
 {
-	int fds_totracee[2], fds_fromtracee[2];
-	int rv;
+	struct msg_fds parent_tracee;
 	const int exitval_tracee = 5;
 	pid_t tracee, wpid;
 	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
@@ -553,47 +516,18 @@ ATF_TC_BODY(attach3, tc)
 #endif
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
-		/* Wait for message 1 from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		/* Send response to parent */
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		/* Wait for message 2 from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
+		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
 		printf("Parent should now attach to tracee\n");
 
-		/* Write to pearent we are ok */
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
 		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracee[1]) == 0);
-
-	printf("Send message 1 to tracee\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-	printf("Wait for response from tracee\n");
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-	printf("Send message 2 to tracee\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
+	
 	printf("Before calling PT_ATTACH for tracee %d\n", tracee);
 	ATF_REQUIRE(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -608,10 +542,7 @@ ATF_TC_BODY(attach3, tc)
 	ATF_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 	printf("Let the tracee exit now\n");
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2", parent_tracee, msg);
 
 	printf("Wait for tracee to exit with %s()\n", TWAIT_FNAME);
 	TWAIT_REQUIRE_SUCCESS(
@@ -623,11 +554,7 @@ ATF_TC_BODY(attach3, tc)
 	TWAIT_REQUIRE_FAILURE(ECHILD,
 	    wpid = TWAIT_GENERIC(tracee, &status, 0));
 
-	printf("fds_fromtracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracee[0]) == 0);
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
+	msg_close(&parent_tracee);
 }
 
 ATF_TC(attach4);
@@ -639,8 +566,7 @@ ATF_TC_HEAD(attach4, tc)
 
 ATF_TC_BODY(attach4, tc)
 {
-	int fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracee;
 	const int exitval_tracer = 5;
 	pid_t tracer, wpid;
 	uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
@@ -649,16 +575,12 @@ ATF_TC_BODY(attach4, tc)
 #endif
 
 	printf("Spawn tracer\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
 
 		/* Wait for message from the parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
 
 		printf("Attach to parent PID %d with PT_ATTACH from child\n",
 		    getppid());
@@ -676,27 +598,15 @@ ATF_TC_BODY(attach4, tc)
 		    != -1);
 
 		/* Tell parent we are ready */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		/* Wait for message from the parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
 
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
 
 	printf("Wait for the tracer to become ready\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("Wait for the tracer to resume\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
 	printf("Allow the tracer to exit now\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Wait for tracer to exit with %s()\n", TWAIT_FNAME);
 	TWAIT_REQUIRE_SUCCESS(
@@ -708,11 +618,7 @@ ATF_TC_BODY(attach4, tc)
 	TWAIT_REQUIRE_FAILURE(ECHILD,
 	    wpid = TWAIT_GENERIC(tracer, &status, 0));
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracee);
 }
 
 #if defined(TWAIT_HAVE_PID)
@@ -726,9 +632,7 @@ ATF_TC_HEAD(attach5, tc)
 
 ATF_TC_BODY(attach5, tc)
 {
-	int fds_totracee[2], fds_fromtracee[2];
-	int fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracer, parent_tracee;
 	const int exitval_tracee = 5;
 	const int exitval_tracer = 10;
 	pid_t parent, tracee, tracer, wpid;
@@ -738,54 +642,29 @@ ATF_TC_BODY(attach5, tc)
 #endif
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
 		parent = getppid();
 
 		/* Emit message to the parent */
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
 
-		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
 
 		FORKEE_ASSERT_EQ(parent, getppid());
 
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracee[1]) == 0);
-
 	printf("Wait for child to record its parent identifier (pid)\n");
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
+	PARENT_TO_CHILD("Message 2", parent_tracee, msg);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
 		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		printf("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -799,12 +678,7 @@ ATF_TC_BODY(attach5, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
-		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
 
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
@@ -815,22 +689,10 @@ ATF_TC_BODY(attach5, tc)
 		printf("Before exiting of the tracer process\n");
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
 
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
-
-	printf("fds_fromtracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracee[0]) == 0);
+	PARENT_FROM_CHILD("Message 1",  parent_tracer, msg);
+	PARENT_TO_CHILD("Message 2",  parent_tracee, msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
@@ -841,8 +703,7 @@ ATF_TC_BODY(attach5, tc)
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2",  parent_tracer, msg);
 
 	printf("Wait for tracer to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -858,11 +719,8 @@ ATF_TC_BODY(attach5, tc)
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracer);
+	msg_close(&parent_tracee);
 }
 #endif
 
@@ -877,9 +735,7 @@ ATF_TC_HEAD(attach6, tc)
 
 ATF_TC_BODY(attach6, tc)
 {
-	int fds_totracee[2], fds_fromtracee[2];
-	int fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracee, parent_tracer;
 	const int exitval_tracee = 5;
 	const int exitval_tracer = 10;
 	pid_t parent, tracee, tracer, wpid;
@@ -893,26 +749,15 @@ ATF_TC_BODY(attach6, tc)
 	unsigned int namelen;
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
 		parent = getppid();
 
 		/* Emit message to the parent */
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
-		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
+		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
 
 		namelen = 0;
 		name[namelen++] = CTL_KERN;
@@ -927,29 +772,14 @@ ATF_TC_BODY(attach6, tc)
 
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracee[1]) == 0);
 
 	printf("Wait for child to record its parent identifier (pid)\n");
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
 		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		printf("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -963,12 +793,9 @@ ATF_TC_BODY(attach6, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
 
-		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
 
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
@@ -979,22 +806,12 @@ ATF_TC_BODY(attach6, tc)
 		printf("Before exiting of the tracer process\n");
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
 
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
 
 	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
-
-	printf("fds_fromtracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracee[0]) == 0);
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
@@ -1005,8 +822,7 @@ ATF_TC_BODY(attach6, tc)
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
 
 	printf("Wait for tracer to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -1022,11 +838,8 @@ ATF_TC_BODY(attach6, tc)
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracee);
+	msg_close(&parent_tracer);
 }
 #endif
 
@@ -1041,8 +854,7 @@ ATF_TC_HEAD(attach7, tc)
 
 ATF_TC_BODY(attach7, tc)
 {
-	int fds_totracee[2], fds_fromtracee[2];
-	int fds_totracer[2], fds_fromtracer[2];
+	struct msg_fds parent_tracee, parent_tracer;
 	int rv;
 	const int exitval_tracee = 5;
 	const int exitval_tracer = 10;
@@ -1067,26 +879,15 @@ ATF_TC_BODY(attach7, tc)
 	}
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
 		parent = getppid();
 
 		/* Emit message to the parent */
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-		rv = write(fds_fromtracee[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
-		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_TO_PARENT("Message 1", parent_tracee, msg);
+		CHILD_FROM_PARENT("Message 2", parent_tracee, msg);
 
 		FORKEE_ASSERT((fp = fopen(fname, "r")) != NULL);
 		fscanf(fp, "%s %d %d", s_executable, &s_pid, &s_ppid);
@@ -1095,29 +896,14 @@ ATF_TC_BODY(attach7, tc)
 
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracee[1]) == 0);
 
 	printf("Wait for child to record its parent identifier (pid)\n");
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
-	rv = read(fds_fromtracee[0], &msg, sizeof(msg));
-	FORKEE_ASSERT(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracee, msg);
+	PARENT_TO_CHILD("Message 2", parent_tracee, msg);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
-		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracee[0]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		printf("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -1131,13 +917,8 @@ ATF_TC_BODY(attach7, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
-		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
+		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
 		    wpid = TWAIT_GENERIC(tracee, &status, 0), tracee);
@@ -1147,22 +928,10 @@ ATF_TC_BODY(attach7, tc)
 		printf("Before exiting of the tracer process\n");
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
-
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
+	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
 	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
-
-	printf("fds_fromtracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracee[0]) == 0);
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
@@ -1173,8 +942,7 @@ ATF_TC_BODY(attach7, tc)
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
 
 	printf("Wait for tracer to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -1190,11 +958,8 @@ ATF_TC_BODY(attach7, tc)
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracee);
+	msg_close(&parent_tracer);
 }
 #endif
 
@@ -4698,8 +4463,7 @@ ATF_TC_HEAD(lwpinfo2, tc)
 
 ATF_TC_BODY(lwpinfo2, tc)
 {
-	int fds_totracee[2], fds_totracer[2], fds_fromtracer[2];
-	int rv;
+	struct msg_fds parent_tracee, parent_tracer;
 	const int exitval_tracee = 5;
 	const int exitval_tracer = 10;
 	pid_t tracee, tracer, wpid;
@@ -4709,37 +4473,30 @@ ATF_TC_BODY(lwpinfo2, tc)
 #endif
 	struct ptrace_lwpinfo info = {0};
 
+#if 0
 	/*
 	 * ptrace(2): Signal does not set PL_EVENT_SIGNAL inOB
 	 * (struct ptrace_lwpinfo.)pl_event
 	 */
 	atf_tc_expect_fail("PR kern/51685");
+#endif
 
 	printf("Spawn tracee\n");
-	ATF_REQUIRE(pipe(fds_totracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracee) == 0);
+	ATF_REQUIRE(msg_open(&parent_tracer) == 0);
 	tracee = atf_utils_fork();
 	if (tracee == 0) {
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
 
 		/* Wait for message from the parent */
-		rv = read(fds_totracee[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 1", parent_tracee, msg);
 
 		_exit(exitval_tracee);
 	}
-	ATF_REQUIRE(close(fds_totracee[0]) == 0);
 
 	printf("Spawn debugger\n");
-	ATF_REQUIRE(pipe(fds_totracer) == 0);
-	ATF_REQUIRE(pipe(fds_fromtracer) == 0);
 	tracer = atf_utils_fork();
 	if (tracer == 0) {
 		/* No IPC to communicate with the child */
-		FORKEE_ASSERT(close(fds_totracee[1]) == 0);
-
-		FORKEE_ASSERT(close(fds_totracer[1]) == 0);
-		FORKEE_ASSERT(close(fds_fromtracer[0]) == 0);
-
 		printf("Before calling PT_ATTACH from tracee %d\n", getpid());
 		FORKEE_ASSERT(ptrace(PT_ATTACH, tracee, NULL, 0) != -1);
 
@@ -4771,12 +4528,9 @@ ATF_TC_BODY(lwpinfo2, tc)
 		FORKEE_ASSERT(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
 
 		/* Inform parent that tracer has attached to tracee */
-		rv = write(fds_fromtracer[1], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
-
+		CHILD_TO_PARENT("Message 1", parent_tracer, msg);
 		/* Wait for parent */
-		rv = read(fds_totracer[0], &msg, sizeof(msg));
-		FORKEE_ASSERT(rv == sizeof(msg));
+		CHILD_FROM_PARENT("Message 2", parent_tracer, msg);
 
 		/* Wait for tracee and assert that it exited */
 		FORKEE_REQUIRE_SUCCESS(
@@ -4787,19 +4541,12 @@ ATF_TC_BODY(lwpinfo2, tc)
 		printf("Before exiting of the tracer process\n");
 		_exit(exitval_tracer);
 	}
-	ATF_REQUIRE(close(fds_totracer[0]) == 0);
-	ATF_REQUIRE(close(fds_fromtracer[1]) == 0);
 
 	printf("Wait for the tracer to attach to the tracee\n");
-	rv = read(fds_fromtracer[0], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_FROM_CHILD("Message 1", parent_tracer, msg);
 
 	printf("Resume the tracee and let it exit\n");
-	rv = write(fds_totracee[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
-
-	printf("fds_totracee is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracee[1]) == 0);
+	PARENT_TO_CHILD("Message 1", parent_tracee, msg);
 
 	printf("Detect that tracee is zombie\n");
 	await_zombie(tracee);
@@ -4810,8 +4557,7 @@ ATF_TC_BODY(lwpinfo2, tc)
 	    wpid = TWAIT_GENERIC(tracee, &status, WNOHANG), 0);
 
 	printf("Resume the tracer and let it detect exited tracee\n");
-	rv = write(fds_totracer[1], &msg, sizeof(msg));
-	ATF_REQUIRE(rv == sizeof(msg));
+	PARENT_TO_CHILD("Message 2", parent_tracer, msg);
 
 	printf("Wait for tracer to finish its job and exit - calling %s()\n",
 	    TWAIT_FNAME);
@@ -4827,11 +4573,8 @@ ATF_TC_BODY(lwpinfo2, tc)
 
 	validate_status_exited(status, exitval_tracee);
 
-	printf("fds_fromtracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_fromtracer[0]) == 0);
-
-	printf("fds_totracer is no longer needed - close it\n");
-	ATF_REQUIRE(close(fds_totracer[1]) == 0);
+	msg_close(&parent_tracer);
+	msg_close(&parent_tracee);
 }
 #endif
 

Index: src/tests/kernel/t_ptrace_wait.h
diff -u src/tests/kernel/t_ptrace_wait.h:1.1 src/tests/kernel/t_ptrace_wait.h:1.2
--- src/tests/kernel/t_ptrace_wait.h:1.1	Thu Dec  1 15:11:17 2016
+++ src/tests/kernel/t_ptrace_wait.h	Mon Dec  5 15:10:10 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_ptrace_wait.h,v 1.1 2016/12/01 20:11:17 kamil Exp $	*/
+/*	$NetBSD: t_ptrace_wait.h,v 1.2 2016/12/05 20:10:10 christos Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -124,6 +124,16 @@
  * always refer to checks for positive values.
  */
 
+#define TEST_REQUIRE_EQ(x, y)						\
+do {									\
+	uintmax_t vx = (x);						\
+	uintmax_t vy = (y);						\
+	int ret = vx == vy;						\
+	if (!ret)							\
+		ATF_REQUIRE_EQ_MSG(vx, vy, "%s(%ju) == %s(%ju)", 	\
+		    #x, vx, #y, vy);					\
+} while (/*CONSTCOND*/0)
+
 /*
  * A child process cannot call atf functions and expect them to magically
  * work like in the parent.
@@ -134,11 +144,13 @@
  */
 #define FORKEE_ASSERT_EQ(x, y)						\
 do {									\
-	int ret = (x) == (y);						\
+	uintmax_t vx = (x);						\
+	uintmax_t vy = (y);						\
+	int ret = vx == vy;						\
 	if (!ret)							\
 		errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: "	\
-		    "%s(%d) == %s(%d)", __FILE__, __LINE__, __func__,	\
-		    #x, (int)x, #y, (int)y);				\
+		    "%s(%ju) == %s(%ju)", __FILE__, __LINE__, __func__,	\
+		    #x, vx, #y, vy);					\
 } while (/*CONSTCOND*/0)
 
 #define FORKEE_ASSERTX(x)						\
@@ -191,15 +203,15 @@ do {									\
  * are no stopped, continued or exited children, 0 is returned.
  */
 #if defined(TWAIT_WAITID)
-#define TWAIT_REQUIRE_SUCCESS(a,b)	ATF_REQUIRE((a) == 0)
+#define TWAIT_REQUIRE_SUCCESS(a,b)	TEST_REQUIRE_EQ((a), 0)
 #define TWAIT_REQUIRE_FAILURE(a,b)	ATF_REQUIRE_ERRNO((a),(b) == -1)
-#define FORKEE_REQUIRE_SUCCESS(a,b)	FORKEE_ASSERTX((a) == 0)
+#define FORKEE_REQUIRE_SUCCESS(a,b)	FORKEE_ASSERT_EQ(a, 0)
 #define FORKEE_REQUIRE_FAILURE(a,b)	\
 	FORKEE_ASSERTX(((a) == errno) && ((b) == -1))
 #else
-#define TWAIT_REQUIRE_SUCCESS(a,b)	ATF_REQUIRE((a) == (b))
+#define TWAIT_REQUIRE_SUCCESS(a,b)	TEST_REQUIRE_EQ((a), (b))
 #define TWAIT_REQUIRE_FAILURE(a,b)	ATF_REQUIRE_ERRNO((a),(b) == -1)
-#define FORKEE_REQUIRE_SUCCESS(a,b)	FORKEE_ASSERTX((a) == (b))
+#define FORKEE_REQUIRE_SUCCESS(a,b)	FORKEE_ASSERT_EQ(a, b)
 #define FORKEE_REQUIRE_FAILURE(a,b)	\
 	FORKEE_ASSERTX(((a) == errno) && ((b) == -1))
 #endif

Added files:

Index: src/tests/kernel/msg.h
diff -u /dev/null src/tests/kernel/msg.h:1.1
--- /dev/null	Mon Dec  5 15:10:10 2016
+++ src/tests/kernel/msg.h	Mon Dec  5 15:10:10 2016
@@ -0,0 +1,136 @@
+/*	$NetBSD: msg.h,v 1.1 2016/12/05 20:10:10 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2016 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+struct msg_fds {
+	int pfd[2];
+	int cfd[2];
+};
+
+#define CLOSEFD(fd) do { \
+	if (fd != -1) { \
+		close(fd); \
+		fd = -1; \
+	} \
+} while (/*CONSTCOND*/ 0)
+
+static int
+msg_open(struct msg_fds *fds)
+{
+	if (pipe(fds->pfd) == -1)
+		return -1;
+	if (pipe(fds->cfd) == -1) {
+		close(fds->pfd[0]);
+		close(fds->pfd[1]);
+		return -1;
+	}
+	return 0;
+}
+
+static void
+msg_close(struct msg_fds *fds)
+{
+	CLOSEFD(fds->pfd[0]);
+	CLOSEFD(fds->pfd[1]);
+	CLOSEFD(fds->cfd[0]);
+	CLOSEFD(fds->cfd[1]);
+}
+
+static int
+msg_write_child(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+	ssize_t rv;
+	CLOSEFD(fds->cfd[1]);
+	CLOSEFD(fds->pfd[0]);
+
+	printf("Send %s\n", info);
+	rv = write(fds->pfd[1], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+//	printf("Wait %s\n", info);
+	rv = read(fds->cfd[0], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+	return 0;
+}
+
+static int
+msg_write_parent(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+	ssize_t rv;
+	CLOSEFD(fds->pfd[1]);
+	CLOSEFD(fds->cfd[0]);
+
+	printf("Send %s\n", info);
+	rv = write(fds->cfd[1], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+//	printf("Wait %s\n", info);
+	rv = read(fds->pfd[0], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+	return 0;
+}
+
+static int
+msg_read_parent(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+	ssize_t rv;
+	CLOSEFD(fds->pfd[1]);
+	CLOSEFD(fds->cfd[0]);
+
+	printf("Wait %s\n", info);
+	rv = read(fds->pfd[0], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+//	printf("Send %s\n", info);
+	rv = write(fds->cfd[1], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+	return 0;
+}
+
+static int
+msg_read_child(const char *info, struct msg_fds *fds, void *msg, size_t len)
+{
+	ssize_t rv;
+	CLOSEFD(fds->cfd[1]);
+	CLOSEFD(fds->pfd[0]);
+
+	printf("Wait %s\n", info);
+	rv = read(fds->cfd[0], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+//	printf("Send %s\n", info);
+	rv = write(fds->pfd[1], msg, len);
+	if (rv != (ssize_t)len)
+		return 1;
+	return 0;
+}

Reply via email to