failtest: capture pread/pwrite
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 15 Feb 2011 12:33:35 +0000 (23:03 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 15 Feb 2011 12:33:35 +0000 (23:03 +1030)
ccan/failtest/failtest.c
ccan/failtest/failtest.h
ccan/failtest/failtest_override.h
ccan/failtest/failtest_proto.h

index 1118466ebc5d963bb78c8a218e73689a37c164bc..a9e1aa49887e0b97b4a4be7c89aeb5c8271e9d24 100644 (file)
@@ -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)
 {
index 5c57efcfe71284eaaa24e93ad74c54e0eae6316b..e8bf10ab5f6c46e056833610fd8c57b54bb1e3d5 100644 (file)
@@ -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 {
index 3bd0f8fc2443d43a9459ac96529b6792687c0623..236441fcfc78e74c6dd632308d5bed7eaf4f5223 100644 (file)
 #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)
 
index 4d316d441b08ded3cdd052d83b50bbf7148088ca..89e1e1b6fd9e6c67d0ecca3cfac72f6f75992ef3 100644 (file)
@@ -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 */