X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=3f64bc91b512e35cb05a812979118ee06b9b1280;hp=77aea9a7de6e185226f07a63b7ecb47dadf3a93b;hb=b7dedf4344c7e573c048a36e7b456f2a4bdbebb7;hpb=460f62ce63a6ef4aaa0f8840474c039f7e73399f diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 77aea9a7..3f64bc91 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; @@ -362,10 +363,11 @@ static bool should_fail(struct failtest_call *call) if (*failpath == '+') failpath = NULL; else { - if (tolower(*failpath) != info_to_arg[call->type]) + if (tolower((unsigned char)*failpath) + != info_to_arg[call->type]) errx(1, "Failpath expected '%c' got '%c'\n", info_to_arg[call->type], *failpath); - call->fail = isupper(*(failpath++)); + call->fail = isupper((unsigned char)*(failpath++)); return call->fail; } } @@ -375,7 +377,7 @@ static bool should_fail(struct failtest_call *call) unsigned int i; for (i = 0; i < history_num; i++) { - char c = info_to_arg[history[i].type]; + unsigned char c = info_to_arg[history[i].type]; if (history[i].fail) c = toupper(c); if (c != debugpath[i]) @@ -429,7 +431,7 @@ static bool should_fail(struct failtest_call *call) if (child == 0) { if (tracefd != -1) { struct timeval now; - char str[50], *p; + const char *p; gettimeofday(&now, NULL); if (now.tv_usec < start.tv_usec) { now.tv_sec--; @@ -437,20 +439,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); - free(p); - trace_str("("); - p = strchr(history[history_num-1].file, '/'); + trace("%u->%u (%u.%02u): %s (", getppid(), getpid(), + (int)now.tv_sec, (int)now.tv_usec / 10000, p); + free((char *)p); + 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 +981,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 +989,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)