X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftap%2Ftap.c;h=0eaec9a5f852827d879553cfd50cd8bdf252f2c6;hb=53b6a92e206fbc41ca9fbd5254896517cc4b83ec;hp=4bbd977bbfdd6f3312295afb67a3d9e5d7832206;hpb=650c775ff00cccd03fc84e7789a03c51d9839004;p=ccan diff --git a/ccan/tap/tap.c b/ccan/tap/tap.c index 4bbd977b..0eaec9a5 100644 --- a/ccan/tap/tap.c +++ b/ccan/tap/tap.c @@ -23,11 +23,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#define _GNU_SOURCE +/* FIXME: The real fix is an asprintf module. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif #include #include #include #include +#include #include "tap.h" @@ -41,6 +45,7 @@ static char *todo_msg = NULL; static char *todo_msg_fixed = "libtap malloc issue"; static int todo = 0; static int test_died = 0; +static int test_pid; /* Encapsulate the pthread code in a conditional. In the absence of libpthread the code does nothing */ @@ -65,9 +70,9 @@ _expected_tests(unsigned int tests) static void diagv(char *fmt, va_list ap) { - fputs("# ", stderr); - vfprintf(stderr, fmt, ap); - fputs("\n", stderr); + fputs("# ", stdout); + vfprintf(stdout, fmt, ap); + fputs("\n", stdout); } static void @@ -103,7 +108,8 @@ _gen_result(int ok, const char *func, char *file, unsigned int line, expansions on it */ if(test_name != NULL) { va_start(ap, test_name); - vasprintf(&local_test_name, test_name, ap); + if (vasprintf(&local_test_name, test_name, ap) < 0) + local_test_name = NULL; va_end(ap); /* Make sure the test name contains more than digits @@ -185,6 +191,9 @@ _gen_result(int ok, const char *func, char *file, unsigned int line, static void _cleanup(void) { + /* If we forked, don't do cleanup in child! */ + if (getpid() != test_pid) + return; LOCK; @@ -245,6 +254,7 @@ _tap_init(void) static int run_once = 0; if(!run_once) { + test_pid = getpid(); atexit(_cleanup); /* stdout needs to be unbuffered so that the output appears @@ -357,7 +367,8 @@ skip(unsigned int n, char *fmt, ...) LOCK; va_start(ap, fmt); - vasprintf(&skip_msg, fmt, ap); + if (vasprintf(&skip_msg, fmt, ap) < 0) + skip_msg = NULL; va_end(ap); while(n-- > 0) { @@ -380,7 +391,8 @@ todo_start(char *fmt, ...) LOCK; va_start(ap, fmt); - vasprintf(&todo_msg, fmt, ap); + if (vasprintf(&todo_msg, fmt, ap) < 0) + todo_msg = NULL; va_end(ap); todo = 1;