]> git.ozlabs.org Git - ccan/blobdiff - ccan/failtest/failtest.c
failtest: fix history when --failpath used
[ccan] / ccan / failtest / failtest.c
index 2b78b8e3f8bdc655aaa9234ffa1335fe73c6ac8a..4b5ab10ada23714123f65cfaf24f2e6a3909a72f 100644 (file)
@@ -265,7 +265,8 @@ static bool should_fail(struct failtest_call *call)
                if (tolower(*failpath) != info_to_arg[call->type])
                        errx(1, "Failpath expected '%c' got '%c'\n",
                             info_to_arg[call->type], *failpath);
-               return isupper(*(failpath++));
+               call->fail = isupper(*(failpath++));
+               return call->fail;
        }
 
        if (!failtest_hook(history, history_num)) {
@@ -418,17 +419,17 @@ void *failtest_realloc(void *ptr, size_t size, const char *file, unsigned line)
        return p->u.realloc.ret;
 }
 
-int failtest_open(const char *pathname, int flags,
+int failtest_open(const char *pathname,
                  const char *file, unsigned line, ...)
 {
        struct failtest_call *p;
        struct open_call call;
+       va_list ap;
 
        call.pathname = strdup(pathname);
-       call.flags = flags;
-       if (flags & O_CREAT) {
-               va_list ap;
-               va_start(ap, line);
+       va_start(ap, line);
+       call.flags = va_arg(ap, int);
+       if (call.flags & O_CREAT) {
                call.mode = va_arg(ap, mode_t);
                va_end(ap);
        }
@@ -441,7 +442,7 @@ int failtest_open(const char *pathname, int flags,
                /* FIXME: Play with error codes? */
                p->error = EACCES;
        } else {
-               p->u.open.ret = open(pathname, flags, call.mode);
+               p->u.open.ret = open(pathname, call.flags, call.mode);
        }
        errno = p->error;
        return p->u.open.ret;
@@ -466,14 +467,15 @@ int failtest_pipe(int pipefd[2], const char *file, unsigned line)
        return p->u.pipe.ret;
 }
 
-ssize_t failtest_read(int fd, void *buf, size_t count,
-                     const char *file, unsigned line)
+ssize_t failtest_pread(int fd, void *buf, size_t count, off_t off,
+                      const char *file, unsigned line)
 {
        struct failtest_call *p;
        struct read_call call;
        call.fd = fd;
        call.buf = buf;
        call.count = count;
+       call.off = off;
        p = add_history(FAILTEST_READ, file, line, &call);
 
        /* This is going to change seek offset, so save it. */
@@ -485,7 +487,7 @@ ssize_t failtest_read(int fd, void *buf, size_t count,
                p->u.read.ret = -1;
                p->error = EIO;
        } else {
-               p->u.read.ret = read(fd, buf, count);
+               p->u.read.ret = pread(fd, buf, count, off);
        }
        errno = p->error;
        return p->u.read.ret;
@@ -497,8 +499,8 @@ static struct write_info *new_write(void)
        return &writes[writes_num++];
 }
 
-ssize_t failtest_write(int fd, const void *buf, size_t count,
-                      const char *file, unsigned line)
+ssize_t failtest_pwrite(int fd, const void *buf, size_t count, off_t off,
+                       const char *file, unsigned line)
 {
        struct failtest_call *p;
        struct write_call call;
@@ -507,6 +509,7 @@ ssize_t failtest_write(int fd, const void *buf, size_t count,
        call.fd = fd;
        call.buf = buf;
        call.count = count;
+       call.off = off;
        p = add_history(FAILTEST_WRITE, file, line, &call);
 
        offset = lseek(fd, 0, SEEK_CUR);
@@ -570,12 +573,26 @@ ssize_t failtest_write(int fd, const void *buf, size_t count,
                                return p->u.write.ret;
                        }
                }
-               p->u.write.ret = write(fd, buf, count);
+               p->u.write.ret = pwrite(fd, buf, count, off);
        }
        errno = p->error;
        return p->u.write.ret;
 }
 
+ssize_t failtest_read(int fd, void *buf, size_t count,
+                     const char *file, unsigned line)
+{
+       return failtest_pread(fd, buf, count, lseek(fd, 0, SEEK_CUR),
+                             file, line);
+}
+
+ssize_t failtest_write(int fd, const void *buf, size_t count,
+                      const char *file, unsigned line)
+{
+       return failtest_pwrite(fd, buf, count, lseek(fd, 0, SEEK_CUR),
+                              file, line);
+}
+
 static struct lock_info *WARN_UNUSED_RESULT
 add_lock(struct lock_info *locks, int fd, off_t start, off_t end, int type)
 {