| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | /* * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. *//* * Based in part on the files *		./sysdeps/unix/sysv/linux/pwrite.c, *		./sysdeps/unix/sysv/linux/pread.c, *		sysdeps/posix/pread.c *		sysdeps/posix/pwrite.c * from GNU libc 2.2.5, but reworked considerably... */#include <sys/syscall.h>#include <unistd.h>#include <endian.h>#include <bits/wordsize.h>#include <cancel.h>#ifdef __NR_pread64# undef __NR_pread# define __NR_pread __NR_pread64#endif#ifdef __NR_pwrite64# undef __NR_pwrite# define __NR_pwrite __NR_pwrite64#endif#ifndef MY_PREAD# ifdef __NR_pread#  define __NR___syscall_pread __NR_pread#  if defined(__UCLIBC_SYSCALL_ALIGN_64BIT__)static _syscall6(ssize_t, __syscall_pread, int, fd, void *, buf,		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)#   define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, 0, OFF_HI_LO(offset))#   define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, 0, OFF64_HI_LO(offset))#  elif __WORDSIZE == 32static _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,		 size_t, count, off_t, offset_hi, off_t, offset_lo)#   define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF_HI_LO(offset))#   define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, OFF64_HI_LO(offset))#  elsestatic _syscall4(ssize_t, __syscall_pread, int, fd, void *, buf,		 size_t, count, off_t, offset)#   define MY_PREAD(fd, buf, count, offset) __syscall_pread(fd, buf, count, offset)#   define MY_PREAD64(fd, buf, count, offset) __syscall_pread(fd, buf, count, offset)#  endif# endif#endif#ifndef MY_PWRITE# ifdef __NR_pwrite#  define __NR___syscall_pwrite __NR_pwrite#  if defined(__UCLIBC_SYSCALL_ALIGN_64BIT__)static _syscall6(ssize_t, __syscall_pwrite, int, fd, const void *, buf,		 size_t, count, int, dummy, off_t, offset_hi, off_t, offset_lo)#   define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 0, OFF_HI_LO(offset))#   define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, 0, OFF64_HI_LO(offset))#  elif __WORDSIZE == 32static _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, buf,		 size_t, count, off_t, offset_hi, off_t, offset_lo)#   define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF_HI_LO(offset))#   define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, OFF64_HI_LO(offset))#  elsestatic _syscall4(ssize_t, __syscall_pwrite, int, fd, const void *, buf,		 size_t, count, off_t, offset)#   define MY_PWRITE(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, offset)#   define MY_PWRITE64(fd, buf, count, offset) __syscall_pwrite(fd, buf, count, offset)#  endif# endif#endifstatic ssize_t __NC(pread)(int fd, void *buf, size_t count, off_t offset){	return MY_PREAD(fd, buf, count, offset);}CANCELLABLE_SYSCALL(ssize_t, pread, (int fd, void *buf, size_t count, off_t offset),		    (fd, buf, count, offset))static ssize_t __NC(pwrite)(int fd, const void *buf, size_t count, off_t offset){	return MY_PWRITE(fd, buf, count, offset);}CANCELLABLE_SYSCALL(ssize_t, pwrite, (int fd, const void *buf, size_t count, off_t offset),		    (fd, buf, count, offset))#if __WORDSIZE == 32static ssize_t __NC(pread64)(int fd, void *buf, size_t count, off64_t offset){	return MY_PREAD64(fd, buf, count, offset);}CANCELLABLE_SYSCALL(ssize_t, pread64, (int fd, void *buf, size_t count, off64_t offset),		    (fd, buf, count, offset))static ssize_t __NC(pwrite64)(int fd, const void *buf, size_t count, off64_t offset){	return MY_PWRITE64(fd, buf, count, offset);}CANCELLABLE_SYSCALL(ssize_t, pwrite64, (int fd, const void *buf, size_t count, off64_t offset),		    (fd, buf, count, offset))#else# ifdef __UCLIBC_HAS_LINUXTHREADS__weak_alias(pread,pread64)weak_alias(pwrite,pwrite64)lt_strong_alias(pread64)lt_strong_alias(pwrite64)# elsestrong_alias_untyped(pread,pread64)strong_alias_untyped(pwrite,pwrite64)# endif#endif
 |