svn commit: r263352 - head/tools/regression/priv

Julio Merino jmmv at FreeBSD.org
Wed Mar 19 12:51:41 UTC 2014


Author: jmmv
Date: Wed Mar 19 12:51:40 2014
New Revision: 263352
URL: http://svnweb.freebsd.org/changeset/base/263352

Log:
  Make the priv test program exit with non-zero if any failures are detected.
  
  And, mind you, this already returns a failure :-/

Modified:
  head/tools/regression/priv/main.c

Modified: head/tools/regression/priv/main.c
==============================================================================
--- head/tools/regression/priv/main.c	Wed Mar 19 12:46:04 2014	(r263351)
+++ head/tools/regression/priv/main.c	Wed Mar 19 12:51:40 2014	(r263352)
@@ -53,6 +53,16 @@
 #include "main.h"
 
 /*
+ * If true, some test or preparatory step failed along the execution of this
+ * program.
+ *
+ * Intuitively, we would define a counter instead of a boolean.  However,
+ * we fork to run the subtests and keeping proper track of the number of
+ * failed tests would be tricky and not provide any real value.
+ */
+static int something_failed = 0;
+
+/*
  * Registration table of privilege tests.  Each test registers a name, a test
  * function, and a cleanup function to run after the test has completed,
  * regardless of success/failure.
@@ -358,13 +368,18 @@ expect(const char *test, int error, int 
 {
 
 	if (error == 0) {
-		if (expected_error != 0)
+		if (expected_error != 0) {
+			something_failed = 1;
 			warnx("%s: returned 0", test);
+		}
 	} else {
-		if (expected_error == 0)
+		if (expected_error == 0) {
+			something_failed = 1;
 			warn("%s: returned (%d, %d)", test, error, errno);
-		else if (expected_errno != errno)
+		} else if (expected_errno != errno) {
+			something_failed = 1;
 			warn("%s: returned (%d, %d)", test, error, errno);
+		}
 	}
 }
 
@@ -488,14 +503,24 @@ run(struct test *test, int asroot, int i
 		run_child(test, asroot, injail);
 		fflush(stdout);
 		fflush(stderr);
-		exit(0);
+		exit(something_failed ? EXIT_FAILURE : EXIT_SUCCESS);
 	} else {
 		while (1) {
-			pid = waitpid(childpid, NULL, 0);
-			if (pid == -1)
+			int status;
+			pid = waitpid(childpid, &status, 0);
+			if (pid == -1) {
+				something_failed = 1;
 				warn("test: waitpid %s", test->t_name);
-			if (pid == childpid)
+			}
+			if (pid == childpid) {
+				if (WIFEXITED(status) &&
+				    WEXITSTATUS(status) == EXIT_SUCCESS) {
+					/* All good in the subprocess! */
+				} else {
+					something_failed = 1;
+				}
 				break;
+			}
 		}
 	}
 	fflush(stdout);
@@ -530,5 +555,5 @@ main(int argc, char *argv[])
 		run(&tests[i], 1, 0);
 		run(&tests[i], 1, 1);
 	}
-	return (0);
+	return (something_failed ? EXIT_FAILURE : EXIT_SUCCESS);
 }


More information about the svn-src-all mailing list