diff options
author | Roland McGrath <roland@gnu.org> | 2006-03-01 06:38:57 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2006-03-01 06:38:57 +0000 |
commit | fd0aa33958d932b879502ea279bd72cb61306b97 (patch) | |
tree | 0b8328d0d5a6f7afd98632e69ae9a01eb56d8dc0 /sysdeps/unix/sysv/linux/sh/pwrite.c | |
parent | d78efd9f369a8fc46229fc9224e10e3781eecc43 (diff) | |
download | glibc-fd0aa33958d932b879502ea279bd72cb61306b97.tar.gz glibc-fd0aa33958d932b879502ea279bd72cb61306b97.tar.xz glibc-fd0aa33958d932b879502ea279bd72cb61306b97.zip |
* sysdeps/unix/sysv/linux/sh/pread.c: Copy in mips pread.c. cvs/fedora-glibc-20060301T0647
* sysdeps/unix/sysv/linux/sh/pwrite.c: Copy in mips pwrite.c. * sysdeps/unix/sysv/linux/sh/pread64.c: Copy in mips pread64.c. * sysdeps/unix/sysv/linux/sh/pwrite64.c: Copy in mips pwrite64.c.
Diffstat (limited to 'sysdeps/unix/sysv/linux/sh/pwrite.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/sh/pwrite.c | 96 |
1 files changed, 93 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/sh/pwrite.c b/sysdeps/unix/sysv/linux/sh/pwrite.c index b75a6a968e..f0e2bc7e0f 100644 --- a/sysdeps/unix/sysv/linux/sh/pwrite.c +++ b/sysdeps/unix/sysv/linux/sh/pwrite.c @@ -1,3 +1,93 @@ -#define NO_SGIDEFS_H -#define _MIPS_SIM -1 -#include <sysdeps/unix/sysv/linux/mips/pwrite.c> +/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004, 2006 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <assert.h> +#include <errno.h> +#include <unistd.h> +#include <endian.h> + +#include <sysdep-cancel.h> +#include <sys/syscall.h> +#include <bp-checks.h> + +#include <kernel-features.h> + +#ifdef __NR_pwrite64 /* Newer kernels renamed but it's the same. */ +# ifdef __NR_pwrite +# error "__NR_pwrite and __NR_pwrite64 both defined???" +# endif +# define __NR_pwrite __NR_pwrite64 +#endif + +#if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0 + +# if __ASSUME_PWRITE_SYSCALL == 0 +static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count, + off_t offset) internal_function; +# endif + +ssize_t +__libc_pwrite (fd, buf, count, offset) + int fd; + const void *buf; + size_t count; + off_t offset; +{ + ssize_t result; + + if (SINGLE_THREAD_P) + { + /* First try the syscall. */ + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); +# if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ + result = __emulate_pwrite (fd, buf, count, offset); +# endif + return result; + } + + int oldtype = LIBC_CANCEL_ASYNC (); + + /* First try the syscall. */ + result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0, + __LONG_LONG_PAIR (offset >> 31, offset)); +# if __ASSUME_PWRITE_SYSCALL == 0 + if (result == -1 && errno == ENOSYS) + /* No system call available. Use the emulation. */ + result = __emulate_pwrite (fd, buf, count, offset); +# endif + + LIBC_CANCEL_RESET (oldtype); + + return result; +} + +strong_alias (__libc_pwrite, __pwrite) +weak_alias (__libc_pwrite, pwrite) + +# define __libc_pwrite(fd, buf, count, offset) \ + static internal_function __emulate_pwrite (fd, buf, count, offset) +#endif + +#if __ASSUME_PWRITE_SYSCALL == 0 +# include <sysdeps/posix/pwrite.c> +#endif |