1 /* 2 * lseek() for uClibc 3 * 4 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> 5 * 6 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. 7 */ 8 9 #include <sys/syscall.h> 10 #include <unistd.h> 11 #include <cancel.h> 12 13 #ifdef __NR_lseek 14 # define __NR___lseek_nocancel __NR_lseek 15 _syscall3(off_t, __NC(lseek), int, fd, off_t, offset, int, whence) 16 #elif !defined __NR_lseek && defined __NR_llseek 17 #include <endian.h> 18 off_t __NC(lseek)(int fd, off_t offset, int whence) 19 { 20 #if __WORDSIZE == 32 21 __off64_t result; 22 return INLINE_SYSCALL(llseek, 5, fd, 23 (long) (((uint64_t) (offset)) >> 32), 24 (long) offset, &result, whence) ?: result; 25 #else 26 return lseek64(fd, offset, whence); 27 #endif 28 /* No need to handle __WORDSIZE == 64 as such a kernel won't define __NR_llseek */ 29 } 30 #else 31 # include <errno.h> 32 off_t __NC(lseek)(int fd, off_t offset attribute_unused, int whence) 33 { 34 if (fd < 0) { 35 __set_errno(EBADF); 36 return -1; 37 } 38 39 switch(whence) { 40 case SEEK_SET: 41 case SEEK_CUR: 42 case SEEK_END: 43 case SEEK_DATA: 44 case SEEK_HOLE: 45 break; 46 default: 47 __set_errno(EINVAL); 48 return -1; 49 } 50 51 __set_errno(ENOSYS); 52 return -1; 53 } 54 #endif 55 CANCELLABLE_SYSCALL(off_t, lseek, (int fd, off_t offset, int whence), (fd, offset, whence)) 56 lt_libc_hidden(lseek) 57 #if __WORDSIZE == 64 || (!defined __NR__llseek && !defined __NR_llseek) 58 strong_alias_untyped(__NC(lseek),__NC(lseek64)) 59 strong_alias_untyped(lseek,lseek64) 60 lt_strong_alias(lseek64) 61 lt_libc_hidden(lseek64) 62 #endif 63