X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=2471510614a070c6c404e04d51789bbc28a8536e;hb=8388c33a83ad51c6fdc355d938f08419d2b24923;hp=7a6f5220e60cd5ed7d1035922b267751c999a84e;hpb=b0a59bdcb3356eec66015bcdffd9a3fbaef0489a;p=ccan diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 7a6f5220..24715106 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +58,8 @@ static pid_t lock_owner; static struct lock_info *locks = NULL; static unsigned int lock_num = 0; +static pid_t orig_pid; + static const char info_to_arg[] = "mceoxprwf"; /* Dummy call used for failtest_undo wrappers. */ @@ -248,7 +251,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; } @@ -293,8 +297,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); @@ -364,7 +371,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", @@ -392,8 +402,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); } } @@ -669,7 +679,7 @@ int failtest_open(const char *pathname, va_start(ap, line); call.flags = va_arg(ap, int); if (call.flags & O_CREAT) { - call.mode = va_arg(ap, mode_t); + call.mode = va_arg(ap, int); va_end(ap); } p = add_history(FAILTEST_OPEN, file, line, &call); @@ -1016,10 +1026,19 @@ int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...) return p->u.fcntl.ret; } +pid_t failtest_getpid(const char *file, unsigned line) +{ + /* You must call failtest_init first! */ + assert(orig_pid); + return orig_pid; +} + void failtest_init(int argc, char *argv[]) { unsigned int i; + orig_pid = getpid(); + for (i = 1; i < argc; i++) { if (!strncmp(argv[i], "--failpath=", strlen("--failpath="))) { failpath = argv[i] + strlen("--failpath="); @@ -1034,6 +1053,11 @@ void failtest_init(int argc, char *argv[]) gettimeofday(&start, NULL); } +bool failtest_has_failed(void) +{ + return control_fd != -1; +} + void failtest_exit(int status) { if (failtest_exit_check) {