X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ffailtest%2Ffailtest.c;h=4b5ab10ada23714123f65cfaf24f2e6a3909a72f;hb=0d66a226c98d0c5b5bced64be3663e52ea6cfb9d;hp=1118466ebc5d963bb78c8a218e73689a37c164bc;hpb=f070b47bc6458e7a374e48c15336f329529e5fdd;p=ccan diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 1118466e..4b5ab10a 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -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)) { @@ -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) {