|  | #include <unistd.h> | 
|  | #include <sys/types.h> | 
|  | #include <errno.h> | 
|  | #include <assert.h> | 
|  | #include <ros/syscall.h> | 
|  |  | 
|  | /* potentially a 32 bit seek (off_t is a long) */ | 
|  | off_t __libc_lseek (int fd, off_t offset, int whence) | 
|  | { | 
|  | loff_t retoff = 0; | 
|  | off_t hi = 0; | 
|  | off_t lo = 0; | 
|  | off_t ret; | 
|  |  | 
|  | if (fd < 0) { | 
|  | __set_errno (EBADF); | 
|  | return -1; | 
|  | } | 
|  | switch (whence) { | 
|  | case SEEK_SET: | 
|  | case SEEK_CUR: | 
|  | case SEEK_END: | 
|  | break; | 
|  | default: | 
|  | __set_errno (EINVAL); | 
|  | return -1; | 
|  | } | 
|  | /* get the high and low part, regardless of whether offset was already | 
|  | * 64 bits or not (casting to avoid warnings) */ | 
|  | hi = (loff_t)offset >> 32; | 
|  | lo = offset & 0xffffffff; | 
|  | ret = ros_syscall(SYS_llseek, fd, hi, lo, &retoff, whence, 0); | 
|  | if (ret) { | 
|  | assert(ret == -1);	/* catch odd bugs */ | 
|  | return ret; | 
|  | } | 
|  | /* Get the lower 32 or 64 bits, depending on the length of long */ | 
|  | ret = retoff & (unsigned long)(-1); | 
|  | return ret; | 
|  | } | 
|  | weak_alias (__libc_lseek, __lseek) | 
|  | libc_hidden_def (__lseek) | 
|  | weak_alias (__libc_lseek, lseek) |