]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/common/llseek.c
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / common / llseek.c
index cd150ad9f7e7a1348f18bdd064ed9a3cd3efc189..09f5435a4e7de43bc2d3a026fafd220bc47d5de6 100644 (file)
@@ -7,31 +7,26 @@
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */
 
-#include <unistd.h>
-#include <sys/types.h>
+#include <_lfs_64.h>
 #include <sys/syscall.h>
+#include <bits/wordsize.h>
 
-#if defined __NR__llseek && defined __UCLIBC_HAS_LFS__
-
-loff_t lseek64(int fd, loff_t offset, int whence)
-{
-       loff_t result;
-       return (loff_t)(INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32),
-                               (off_t) (offset & 0xffffffff), &result, whence) ?: result);
-}
-
-#else
+/* Newer kernel ports have llseek() instead of _llseek() */
+#if !defined __NR__llseek && defined __NR_llseek
+# define __NR__llseek __NR_llseek
+#endif
 
-loff_t lseek64(int fd, loff_t offset, int whence)
+#if defined __NR__llseek && __WORDSIZE == 32
+# include <unistd.h>
+# include <endian.h>
+# include <cancel.h>
+off64_t __NC(lseek64)(int fd, off64_t offset, int whence)
 {
-       return (loff_t)(lseek(fd, (off_t) (offset), whence));
+       off64_t result;
+       /* do we not need to handle the offset with __LONG_LONG_PAIR depending on endianness? */
+       return (off64_t)INLINE_SYSCALL(_llseek, 5, fd, (off_t) OFF64_HI(offset),
+                                      (off_t) OFF64_LO(offset), &result, whence) ?: result;
 }
-
-#endif
-
-#ifndef __LINUXTHREADS_OLD__
-libc_hidden_def(lseek64)
-#else
-libc_hidden_weak(lseek64)
-strong_alias(lseek64,__libc_lseek64)
+CANCELLABLE_SYSCALL(off64_t, lseek64, (int fd, off64_t offset, int whence), (fd, offset, whence))
+lt_libc_hidden(lseek64)
 #endif