]> git.ozlabs.org Git - ccan/blobdiff - ccan/failtest/failtest.c
tdb2: rename internal hashfn and logfn to hash_fn and log_fn.
[ccan] / ccan / failtest / failtest.c
index 7a6f5220e60cd5ed7d1035922b267751c999a84e..061d6e9e3fc911c12c88fe7b122a417287441133 100644 (file)
@@ -12,6 +12,7 @@
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#include <signal.h>
 #include <assert.h>
 #include <ccan/read_write_all/read_write_all.h>
 #include <ccan/failtest/failtest_proto.h>
@@ -248,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;
 }
@@ -293,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);
@@ -364,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",
@@ -392,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);
                }
        }
 
@@ -669,7 +677,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);