/*
* llseek.c
*
- * On 32-bit platforms, we need llseek() as well as lseek() to be
- * able to handle large disks
+ * On 32-bit platforms, we need to use the _llseek() system call
+ * rather than lseek(), to be able to handle large disks. _llseek()
+ * isn't just a normal syscall which takes a 64-bit argument; it needs
+ * to return a 64-bit value and so takes an extra pointer.
*/
#include <unistd.h>
#include <sys/syscall.h>
+#include <bitsize.h>
-#if BITSIZE == 32
+#if _BITSIZE == 32
-static inline _syscall5(int, _llseek, int, fd, unsigned long, hi, unsigned long, lo, loff_t *,res, int, whence);
+extern int __llseek(int fd, unsigned long hi, unsigned long lo, off_t *res, int whence);
-loff_t llseek(int fd, loff_t offset, int whence)
+off_t lseek(int fd, off_t offset, int whence)
{
- loff_t result;
+ off_t result;
int rv;
- rv = _llseek(fd, (unsigned long)(offset >> 32),
- (unsigned long)offset, &result, whence);
+ rv = __llseek(fd, (unsigned long)(offset >> 32), (unsigned long)offset,
+ &result, whence);
- return rv ? (loff_t)-1 : result;
-}
-
-#else
-
-loff_t llseek(int fd, loff_t offset, int whence)
-{
- return lseek(fd, offset, whence);
+ return rv ? (off_t)-1 : result;
}
#endif