make error__ extern and all global state static in main
[libc-test] / common / main.c
index 4c28f71..02e5f1f 100644 (file)
@@ -1,27 +1,69 @@
+#define _POSIX_C_SOURCE 200809L
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
 #include "test.h"
 
 #define T(t) void t();
 #include "main.h"
 #undef T
 
-struct test test__ = {0};
+static int failed;
+static const char *name;
 
 static int verbose;
 static int count;
 static int nfailed;
 
+void error__(const char *n, int l, const char *s, ...) {
+       va_list ap;
+
+       failed = 1;
+       fprintf(stderr, "- ERROR %s at %s:%d: ", name, n, l);
+       va_start(ap, s);
+       vfprintf(stderr, s, ap);
+       va_end(ap);
+}
+
 static void run(const char *n, void (*f)()) {
+       pid_t pid;
+       int s;
+
        count++;
-       test__.failed = 0;
-       test__.name = n;
+       failed = 0;
+       name = n;
        if (verbose)
-               fprintf(stderr, "running %s:\n", test__.name);
-       f();
-       if (test__.failed) {
+               fprintf(stderr, "running %s:\n", name);
+
+       pid = fork();
+       if (pid == 0) {
+               /* run test in a child process */
+               f();
+               exit(failed);
+       }
+
+       if (pid == -1)
+               error("fork failed: %s\n", strerror(errno));
+       else {
+               if (waitpid(pid, &s, 0) == -1)
+                       error("waitpid failed: %s\n", strerror(errno));
+               else if (!WIFEXITED(s))
+                       error("abnormal exit: %s\n", WIFSIGNALED(s) ? strsignal(WTERMSIG(s)) : "(unknown)");
+               else
+                       failed = !!WEXITSTATUS(s);
+       }
+
+       if (failed) {
                nfailed++;
-               fprintf(stderr, "FAILED %s\n", test__.name);
+               fprintf(stderr, "FAILED %s\n", name);
        } else if (verbose)
-               fprintf(stderr, "PASSED %s\n", test__.name);
+               fprintf(stderr, "PASSED %s\n", name);
 }
 
 static int summary() {