X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=851f2eabf043e4e3f8fa8c53cfe2056431a27220;hb=0a36c4014ffa3fc35d70f69303b6a9d3c697c693;hp=334295ad158ed8a8852c5bfe7487b7db0666e303;hpb=8f8b0216dab8e9a91f3696a8a8f3a4ebd8779c7c;p=ccan diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 334295ad..851f2eab 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -84,8 +85,9 @@ static struct failtest_call *add_history_(enum failtest_call_type type, #define add_history(type, file, line, elem) \ add_history_((type), (file), (line), (elem), sizeof(*(elem))) +/* We do a fake call inside a sizeof(), to check types. */ #define set_cleanup(call, clean, type) \ - (call)->cleanup = (void *)((void)sizeof(clean((type *)NULL)), (clean)) + (call)->cleanup = (void *)((void)sizeof(clean((type *)NULL),1), (clean)) static bool read_write_info(int fd) { @@ -247,7 +249,8 @@ static struct saved_file *save_file(struct saved_file *next, int fd) s->len = lseek(fd, 0, SEEK_END); lseek(fd, 0, SEEK_SET); s->contents = malloc(s->len); - read(fd, s->contents, s->len); + if (read(fd, s->contents, s->len) != s->len) + err(1, "Failed to save %zu bytes", (size_t)s->len); lseek(fd, s->off, SEEK_SET); return s; } @@ -292,8 +295,11 @@ static void restore_files(struct saved_file *s) struct saved_file *next = s->next; lseek(s->fd, 0, SEEK_SET); - write(s->fd, s->contents, s->len); - ftruncate(s->fd, s->len); + if (write(s->fd, s->contents, s->len) != s->len) + err(1, "Failed to restore %zu bytes", (size_t)s->len); + if (ftruncate(s->fd, s->len) != 0) + err(1, "Failed to trim file to length %zu", + (size_t)s->len); free(s->contents); lseek(s->fd, s->off, SEEK_SET); free(s); @@ -363,7 +369,10 @@ static bool should_fail(struct failtest_call *call) /* + means continue after end, like normal. */ if (*failpath == '+') failpath = NULL; - else { + else if (*failpath == '\0') { + /* Continue, but don't inject errors. */ + return call->fail = false; + } else { if (tolower((unsigned char)*failpath) != info_to_arg[call->type]) errx(1, "Failpath expected '%c' got '%c'\n", @@ -391,8 +400,8 @@ static bool should_fail(struct failtest_call *call) signal(SIGUSR1, SIG_IGN); sprintf(str, "xterm -e gdb /proc/%d/exe %d &", getpid(), getpid()); - system(str); - sleep(5); + if (system(str) == 0) + sleep(5); } } @@ -482,8 +491,13 @@ static bool should_fail(struct failtest_call *call) else ret = poll(pfd, 2, failtest_timeout_ms); - if (ret <= 0) + if (ret == 0) hand_down(SIGUSR1); + if (ret < 0) { + if (errno == EINTR) + continue; + err(1, "Poll returned %i", ret); + } if (pfd[0].revents & POLLIN) { ssize_t len;