LD_ISCSI add pread

This commit is contained in:
Peter Lieven
2012-11-03 17:48:31 +01:00
parent d2894e4634
commit 2e413a3c9f

View File

@@ -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)");