From 6c02fd599f5b3f925197c3161ee186a3305fc963 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 15 Feb 2011 23:03:35 +1030 Subject: [PATCH] failtest: capture pread/pwrite --- ccan/failtest/failtest.c | 28 ++++++++++++++++++++++------ ccan/failtest/failtest.h | 2 ++ ccan/failtest/failtest_override.h | 8 ++++++++ ccan/failtest/failtest_proto.h | 4 ++++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/ccan/failtest/failtest.c b/ccan/failtest/failtest.c index 1118466e..a9e1aa49 100644 --- a/ccan/failtest/failtest.c +++ b/ccan/failtest/failtest.c @@ -466,14 +466,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 +486,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 +498,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 +508,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 +572,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) { diff --git a/ccan/failtest/failtest.h b/ccan/failtest/failtest.h index 5c57efcf..e8bf10ab 100644 --- a/ccan/failtest/failtest.h +++ b/ccan/failtest/failtest.h @@ -76,6 +76,7 @@ struct read_call { int fd; void *buf; size_t count; + off_t off; }; struct write_call { @@ -83,6 +84,7 @@ struct write_call { int fd; const void *buf; size_t count; + off_t off; }; struct fcntl_call { diff --git a/ccan/failtest/failtest_override.h b/ccan/failtest/failtest_override.h index 3bd0f8fc..236441fc 100644 --- a/ccan/failtest/failtest_override.h +++ b/ccan/failtest/failtest_override.h @@ -39,6 +39,14 @@ #define write(fd, buf, count) \ failtest_write((fd), (buf), (count), __FILE__, __LINE__) +#undef pread +#define pread(fd, buf, count, off) \ + failtest_pread((fd), (buf), (count), (off), __FILE__, __LINE__) + +#undef pwrite +#define pwrite(fd, buf, count, off) \ + failtest_pwrite((fd), (buf), (count), (off), __FILE__, __LINE__) + #undef close #define close(fd) failtest_close(fd) diff --git a/ccan/failtest/failtest_proto.h b/ccan/failtest/failtest_proto.h index 4d316d44..89e1e1b6 100644 --- a/ccan/failtest/failtest_proto.h +++ b/ccan/failtest/failtest_proto.h @@ -15,6 +15,10 @@ ssize_t failtest_read(int fd, void *buf, size_t count, const char *file, unsigned line); ssize_t failtest_write(int fd, const void *buf, size_t count, const char *file, unsigned line); +ssize_t failtest_pread(int fd, void *buf, size_t count, off_t offset, + const char *file, unsigned line); +ssize_t failtest_pwrite(int fd, const void *buf, size_t count, off_t offset, + const char *file, unsigned line); int failtest_close(int fd); int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...); #endif /* CCAN_FAILTEST_PROTO_H */ -- 2.39.2