diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-08-20 07:42:33 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-08-20 07:42:33 +0000 |
commit | d7cb403f824ceb5681262d9d90b1c555d1a6208e (patch) | |
tree | edbefbb0075c59b7a420445b4768904282462a41 /libc/sysdeps | |
parent | ea67a0ceabbe2a337bcf5e7593849a13224e2ff0 (diff) |
- Fix powerpc pread/pwrite (Wade Berrier)
pread/write wanted to send an 8 byte value in the syscall where only 4 bytes
were allowed.
Diffstat (limited to 'libc/sysdeps')
-rw-r--r-- | libc/sysdeps/linux/powerpc/pread_write.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/libc/sysdeps/linux/powerpc/pread_write.c b/libc/sysdeps/linux/powerpc/pread_write.c index cdbadfdf3..aef040c90 100644 --- a/libc/sysdeps/linux/powerpc/pread_write.c +++ b/libc/sysdeps/linux/powerpc/pread_write.c @@ -14,6 +14,7 @@ #include <sys/syscall.h> #include <unistd.h> +#include <endian.h> #ifndef __UCLIBC_HAS_LFS__ # define off64_t off_t @@ -22,12 +23,12 @@ #ifdef __NR_pread extern __typeof(pread) __libc_pread; # define __NR___syscall_pread __NR_pread -static __inline__ _syscall4(ssize_t, __syscall_pread, int, fd, - void *, buf, size_t, count, off64_t, offset); +static __inline__ _syscall6(ssize_t, __syscall_pread, int, fd, + void *, buf, size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo); ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset) { - return(__syscall_pread(fd, buf, count, (off64_t)offset)); + return(__syscall_pread(fd, buf, count, 0, __LONG_LONG_PAIR(offset >> 31, offset))); } weak_alias(__libc_pread,pread) @@ -35,7 +36,7 @@ weak_alias(__libc_pread,pread) extern __typeof(pread64) __libc_pread64; ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset) { - return(__syscall_pread(fd, buf, count, offset)); + return(__syscall_pread(fd, buf, count, 0, __LONG_LONG_PAIR(offset >> 32, offset))); } weak_alias(__libc_pread64,pread64) # endif /* __UCLIBC_HAS_LFS__ */ @@ -45,12 +46,12 @@ weak_alias(__libc_pread64,pread64) #ifdef __NR_pwrite extern __typeof(pwrite) __libc_pwrite; # define __NR___syscall_pwrite __NR_pwrite -static __inline__ _syscall4(ssize_t, __syscall_pwrite, int, fd, - const void *, buf, size_t, count, off64_t, offset); +static __inline__ _syscall6(ssize_t, __syscall_pwrite, int, fd, + const void *, buf, size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo); ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset) { - return(__syscall_pwrite(fd, buf, count, (off64_t)offset)); + return(__syscall_pwrite(fd, buf, count, 0, __LONG_LONG_PAIR(offset >> 31, offset))); } weak_alias(__libc_pwrite,pwrite) @@ -58,7 +59,7 @@ weak_alias(__libc_pwrite,pwrite) extern __typeof(pwrite64) __libc_pwrite64; ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset) { - return(__syscall_pwrite(fd, buf, count, offset)); + return(__syscall_pwrite(fd, buf, count, 0, __LONG_LONG_PAIR(offset >> 32, offset))); } weak_alias(__libc_pwrite64,pwrite64) # endif /* __UCLIBC_HAS_LFS__ */ @@ -87,7 +88,7 @@ static ssize_t __fake_pread_write(int fd, void *buf, if (lseek (fd, offset, SEEK_SET) == (off_t) -1) return -1; - if (do_pwrite==1) { + if (do_pwrite == 1) { /* Write the data. */ result = write(fd, buf, count); } else { @@ -127,7 +128,7 @@ static ssize_t __fake_pread_write64(int fd, void *buf, if (lseek64(fd, offset, SEEK_SET) == (off64_t) -1) return -1; - if (do_pwrite==1) { + if (do_pwrite == 1) { /* Write the data. */ result = write(fd, buf, count); } else { |