From bf758c7833ba922e5ddfa2c1f79fab3f609a9dd8 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Sat, 3 Nov 2012 17:48:31 +0100 Subject: [PATCH] LD_ISCSI add pread --- src/ld_iscsi.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/ld_iscsi.c b/src/ld_iscsi.c index 975e800..47e7214 100644 --- a/src/ld_iscsi.c +++ b/src/ld_iscsi.c @@ -413,6 +413,26 @@ ssize_t read(int fd, void *buf, size_t count) return real_read(fd, buf, count); } +ssize_t (*real_pread)(int fd, void *buf, size_t count, off_t offset); +ssize_t pread(int fd, void *buf, size_t count, off_t offset) { + if ((iscsi_fd_list[fd].is_iscsi == 1 && iscsi_fd_list[fd].in_flight == 0)) { + off_t old_offset; + if ((old_offset = lseek(fd, 0, SEEK_CUR)) < 0) { + errno = EIO; + return -1; + } + if (lseek(fd, offset, SEEK_SET) < 0) { + return -1; + } + if (read(fd, buf, count) < 0) { + lseek(fd, old_offset, SEEK_SET); + return -1; + } + lseek(fd, old_offset, SEEK_SET); + return count; + } + return real_pread(fd, buf, count, offset); +} int (*real_dup2)(int oldfd, int newfd); @@ -546,6 +566,12 @@ static void __attribute__((constructor)) _init(void) exit(10); } + real_pread = dlsym(RTLD_NEXT, "pread"); + if (real_pread == NULL) { + LD_ISCSI_DPRINTF(0,"Failed to dlsym(pread)"); + exit(10); + } + real_dup2 = dlsym(RTLD_NEXT, "dup2"); if (real_dup2 == NULL) { LD_ISCSI_DPRINTF(0,"Failed to dlsym(dup2)");