X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=4f7542f5b16b44f6c8a794cb66033f1f45030c16;hp=77aea9a7de6e185226f07a63b7ecb47dadf3a93b;hb=1ac26f37368b33e0952e19df05184776c80159c8;hpb=460f62ce63a6ef4aaa0f8840474c039f7e73399f diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 77aea9a7..4f7542f5 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -1,3 +1,4 @@ +#include "config.h" #include #include #include @@ -142,11 +143,23 @@ static void child_fail(const char *out, size_t outlen, const char *fmt, ...) exit(1); } +static void trace(const char *fmt, ...) +{ + va_list ap; + + if (tracefd == -1) + return; + + va_start(ap, fmt); + vdprintf(tracefd, fmt, ap); + va_end(ap); +} + static pid_t child; -static void hand_down(int signal) +static void hand_down(int signum) { - kill(child, signal); + kill(child, signum); } static void release_locks(void) @@ -215,18 +228,6 @@ static void get_locks(void) lock_owner = getpid(); } -static void trace_str(const char *str) -{ - ssize_t ret; - - while ((ret = write(tracefd, str, strlen(str))) <= 0) { - str += ret; - if (!*str) - return; - } - err(1, "Writing trace."); -} - struct saved_file { struct saved_file *next; int fd; @@ -429,7 +430,7 @@ static bool should_fail(struct failtest_call *call) if (child == 0) { if (tracefd != -1) { struct timeval now; - char str[50], *p; + char *p; gettimeofday(&now, NULL); if (now.tv_usec < start.tv_usec) { now.tv_sec--; @@ -437,20 +438,16 @@ static bool should_fail(struct failtest_call *call) } now.tv_usec -= start.tv_usec; now.tv_sec -= start.tv_sec; - sprintf(str, "%u (%u.%02u): ", getpid(), - (int)now.tv_sec, (int)now.tv_usec / 10000); - trace_str(str); p = failpath_string(); - trace_str(p); + trace("%u->%u (%u.%02u): %s (", getppid(), getpid(), + (int)now.tv_sec, (int)now.tv_usec / 10000, p); free(p); - trace_str("("); - p = strchr(history[history_num-1].file, '/'); + p = strrchr(history[history_num-1].file, '/'); if (p) - trace_str(p+1); + trace("%s", p+1); else - trace_str(history[history_num-1].file); - sprintf(str, ":%u)\n", history[history_num-1].line); - trace_str(str); + trace("%s", history[history_num-1].file); + trace(":%u)\n", history[history_num-1].line); } close(control[0]); close(output[0]); @@ -983,7 +980,6 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...) } p = add_history(FAILTEST_FCNTL, file, line, &call); - get_locks(); if (should_fail(p)) { p->u.fcntl.ret = -1; @@ -992,6 +988,7 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...) else p->error = EDEADLK; } else { + get_locks(); p->u.fcntl.ret = fcntl(p->u.fcntl.fd, p->u.fcntl.cmd, &p->u.fcntl.arg.fl); if (p->u.fcntl.ret == -1)