* sysdeps/mach/hurd/xstat64.c: Conditionalize entire contents of the

file on [!RTLD_STAT64].
	* sysdeps/mach/hurd/fxstat64.c: Likewise.

	* sysdeps/mach/hurd/tmpfile.c (tmpfile64): Define as alias of tmpfile.
	(__fdopen): Use INTUSE.
	* sysdeps/mach/hurd/tmpfile64.c: New file, empty placeholder.

	* stdio-common/tmpfile64.c: File removed.
	* sysdeps/generic/tmpfile64.c: New file.
	* sysdeps/generic/tmpfile.c (GEN_THIS): New macro, define to __GT_FILE
	if not already defined.
	(tmpfile): Use it in place of __GT_FILE.

	* include/unistd.h: Declare __chown_internal.

	* sysdeps/mach/hurd/sendfile64.c (sendfile64): Do real work here.
	* sysdeps/mach/hurd/sendfile.c (sendfile): Call that.

2002-06-09  Roland McGrath  <roland@frob.com>

	Update to new Hurd RPC interfaces supporting 64-bit file sizes.
	* sysdeps/mach/hurd/configure.in: Check for <hurd/version.h> with
	value of HURD_INTERFACE_VERSION >= 20020609.
	* sysdeps/mach/hurd/configure: Regenerated.
	* shlib-versions (.*-.*-gnu-gnu.*): Set libhurduser=0.3.
	* sysdeps/mach/hurd/xstatconv.c (xstat64_conv): Rewritten to
	convert a struct stat64 into a struct stat and return 0 or -1
	with errno set to EOVERFLOW.
	* sysdeps/mach/hurd/statfsconv.c (statfs64_conv): Likewise
	for struct statfs64 to struct statfs.
	* sysdeps/mach/hurd/xstat.c (__xstat): Use converter and call ...
	* sysdeps/mach/hurd/xstat64.c (__xstat64): ... this, real work here.
	* sysdeps/mach/hurd/fxstat.c (__fxstat): Likewise.
	* sysdeps/mach/hurd/fxstat64.c (__fxstat64): Likewise.
	* sysdeps/mach/hurd/lxstat.c (__lxstat): Likewise.
	* sysdeps/mach/hurd/lxstat64.c (__lxstat64): Likewise.
	* sysdeps/mach/hurd/statfs.c (__statfs): Likewise.
	* sysdeps/mach/hurd/statfs64.c (__statfs64): Likewise.
	* sysdeps/mach/hurd/fstatfs.c (__fstatfs): Likewise.
	* sysdeps/mach/hurd/fstatfs64.c (__fstatfs64): Likewise.
	* sysdeps/mach/hurd/pwrite64.c (__libc_pwrite64): Do real work here.
	* sysdeps/mach/hurd/pwrite.c (__libc_pwrite): Call that.
	* sysdeps/mach/hurd/pread64.c (__libc_pread64): Do real work here.
	* sysdeps/mach/hurd/pread.c (__libc_pread): Call that.
	* sysdeps/mach/hurd/lseek64.c (__libc_lseek64): Do real work here.
	* sysdeps/mach/hurd/lseek.c (__libc_lseek): Call that.
	* sysdeps/mach/hurd/readdir64.c (__readdir64): Do real work here.
	* sysdeps/mach/hurd/readdir.c (__readdir): Call that.
	* sysdeps/mach/hurd/readdir64_r.c (__readdir64_r): Do real work here.
	* sysdeps/mach/hurd/readdir_r.c (__readdir64_r): Call that.
	* hurd/lookup-retry.c (__hurd_file_name_lookup_retry):
	Use struct stat64 for io_stat argument.
	* sysdeps/mach/hurd/readlink.c (__readlink): Likewise.
	* hurd/fopenport.c (seekio): Remove EOVERFLOW check, pass POS directly
	to io_seek.
	* hurd/fd-read.c (_hurd_fd_read): Use loff_t for OFFSET argument.
	* hurd/fd-write.c (_hurd_fd_write): Likewise.
	* hurd/hurd/fd.h: Update decls.
	* sysdeps/mach/hurd/getcwd.c
	(_hurd_canonicalize_directory_name_internal): Use ino64_t
	and struct dirent64.
	* sysdeps/mach/hurd/dl-sysdep.c (open_file): Use struct stat64.
	(__xstat): Renamed to __xstat64, use struct stat64 for argument.
	(__fxstat): Renamed to __fxstat64, use struct stat64 for argument.
	(__lseek): Renamed to __libc_lseek64, use off64_t for argument.

2002-06-08  Roland McGrath  <roland@frob.com>

	* sysdeps/mach/hurd/dirstream.h (struct __dirstream): Use size_t
	instead of unsigned long int for __allocation and __size members.

2002-05-19  Ulrich Drepper  <drepper@redhat.com>
This commit is contained in:
Roland McGrath 2002-06-11 23:04:51 +00:00
parent 522c33f6bb
commit 337738b771
42 changed files with 608 additions and 558 deletions

View File

@ -1,3 +1,77 @@
2002-06-11 Roland McGrath <roland@frob.com>
* sysdeps/mach/hurd/xstat64.c: Conditionalize entire contents of the
file on [!RTLD_STAT64].
* sysdeps/mach/hurd/fxstat64.c: Likewise.
* sysdeps/mach/hurd/tmpfile.c (tmpfile64): Define as alias of tmpfile.
(__fdopen): Use INTUSE.
* sysdeps/mach/hurd/tmpfile64.c: New file, empty placeholder.
* stdio-common/tmpfile64.c: File removed.
* sysdeps/generic/tmpfile64.c: New file.
* sysdeps/generic/tmpfile.c (GEN_THIS): New macro, define to __GT_FILE
if not already defined.
(tmpfile): Use it in place of __GT_FILE.
* include/unistd.h: Declare __chown_internal.
* sysdeps/mach/hurd/sendfile64.c (sendfile64): Do real work here.
* sysdeps/mach/hurd/sendfile.c (sendfile): Call that.
2002-06-09 Roland McGrath <roland@frob.com>
Update to new Hurd RPC interfaces supporting 64-bit file sizes.
* sysdeps/mach/hurd/configure.in: Check for <hurd/version.h> with
value of HURD_INTERFACE_VERSION >= 20020609.
* sysdeps/mach/hurd/configure: Regenerated.
* shlib-versions (.*-.*-gnu-gnu.*): Set libhurduser=0.3.
* sysdeps/mach/hurd/xstatconv.c (xstat64_conv): Rewritten to
convert a struct stat64 into a struct stat and return 0 or -1
with errno set to EOVERFLOW.
* sysdeps/mach/hurd/statfsconv.c (statfs64_conv): Likewise
for struct statfs64 to struct statfs.
* sysdeps/mach/hurd/xstat.c (__xstat): Use converter and call ...
* sysdeps/mach/hurd/xstat64.c (__xstat64): ... this, real work here.
* sysdeps/mach/hurd/fxstat.c (__fxstat): Likewise.
* sysdeps/mach/hurd/fxstat64.c (__fxstat64): Likewise.
* sysdeps/mach/hurd/lxstat.c (__lxstat): Likewise.
* sysdeps/mach/hurd/lxstat64.c (__lxstat64): Likewise.
* sysdeps/mach/hurd/statfs.c (__statfs): Likewise.
* sysdeps/mach/hurd/statfs64.c (__statfs64): Likewise.
* sysdeps/mach/hurd/fstatfs.c (__fstatfs): Likewise.
* sysdeps/mach/hurd/fstatfs64.c (__fstatfs64): Likewise.
* sysdeps/mach/hurd/pwrite64.c (__libc_pwrite64): Do real work here.
* sysdeps/mach/hurd/pwrite.c (__libc_pwrite): Call that.
* sysdeps/mach/hurd/pread64.c (__libc_pread64): Do real work here.
* sysdeps/mach/hurd/pread.c (__libc_pread): Call that.
* sysdeps/mach/hurd/lseek64.c (__libc_lseek64): Do real work here.
* sysdeps/mach/hurd/lseek.c (__libc_lseek): Call that.
* sysdeps/mach/hurd/readdir64.c (__readdir64): Do real work here.
* sysdeps/mach/hurd/readdir.c (__readdir): Call that.
* sysdeps/mach/hurd/readdir64_r.c (__readdir64_r): Do real work here.
* sysdeps/mach/hurd/readdir_r.c (__readdir64_r): Call that.
* hurd/lookup-retry.c (__hurd_file_name_lookup_retry):
Use struct stat64 for io_stat argument.
* sysdeps/mach/hurd/readlink.c (__readlink): Likewise.
* hurd/fopenport.c (seekio): Remove EOVERFLOW check, pass POS directly
to io_seek.
* hurd/fd-read.c (_hurd_fd_read): Use loff_t for OFFSET argument.
* hurd/fd-write.c (_hurd_fd_write): Likewise.
* hurd/hurd/fd.h: Update decls.
* sysdeps/mach/hurd/getcwd.c
(_hurd_canonicalize_directory_name_internal): Use ino64_t
and struct dirent64.
* sysdeps/mach/hurd/dl-sysdep.c (open_file): Use struct stat64.
(__xstat): Renamed to __xstat64, use struct stat64 for argument.
(__fxstat): Renamed to __fxstat64, use struct stat64 for argument.
(__lseek): Renamed to __libc_lseek64, use off64_t for argument.
2002-06-08 Roland McGrath <roland@frob.com>
* sysdeps/mach/hurd/dirstream.h (struct __dirstream): Use size_t
instead of unsigned long int for __allocation and __size members.
2002-06-09 Jakub Jelinek <jakub@redhat.com> 2002-06-09 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/i386/dl-brk.c: Move... * sysdeps/unix/sysv/linux/i386/dl-brk.c: Move...
@ -68,7 +142,7 @@
* sysdeps/mach/hurd/alpha/init-first.c: New file, modified from * sysdeps/mach/hurd/alpha/init-first.c: New file, modified from
i386/init-first.c by Andrew M. Miklic <miklic@attglobal.net>. i386/init-first.c by Andrew M. Miklic <miklic@attglobal.net>.
2002-05-21 Jakub Jelinek <jakub@redhat.com> 2002-05-19 Ulrich Drepper <drepper@redhat.com>
* resolv/resolv.h (struct __res_state): Remove unused nstimes. * resolv/resolv.h (struct __res_state): Remove unused nstimes.
Add nsmap. Add nsmap.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993,94,95,97,99 Free Software Foundation, Inc. /* Copyright (C) 1993,94,95,97,99,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -23,7 +23,7 @@
#include <string.h> #include <string.h>
error_t error_t
_hurd_fd_read (struct hurd_fd *fd, void *buf, size_t *nbytes, off_t offset) _hurd_fd_read (struct hurd_fd *fd, void *buf, size_t *nbytes, loff_t offset)
{ {
error_t err; error_t err;
char *data; char *data;

View File

@ -1,5 +1,5 @@
/* _hurd_fd_write -- write to a file descriptor; handles job control et al. /* _hurd_fd_write -- write to a file descriptor; handles job control et al.
Copyright (C) 1993,94,95,97,99 Free Software Foundation, Inc. Copyright (C) 1993,94,95,97,99,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -24,7 +24,7 @@
error_t error_t
_hurd_fd_write (struct hurd_fd *fd, _hurd_fd_write (struct hurd_fd *fd,
const void *buf, size_t *nbytes, off_t offset) const void *buf, size_t *nbytes, loff_t offset)
{ {
error_t err; error_t err;
mach_msg_type_number_t wrote; mach_msg_type_number_t wrote;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1994,95,97,2000,01 Free Software Foundation, Inc. /* Copyright (C) 1994,95,97,2000,01,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -70,23 +70,8 @@ seekio (void *cookie,
#endif #endif
int whence) int whence)
{ {
off_t res; error_t err = __io_seek ((file_t) cookie, *pos, whence, pos);
error_t error; return err ? __hurd_fail (err) : 0;
/* XXX We don't really support large files on the Hurd. So if POS
doesn't fit in an `off_t', we'll return `-1' and set errno. EOVERFLOW
probably isn't the right error value, but seems appropriate here. */
if ((off_t) *pos != *pos)
{
__set_errno (EOVERFLOW);
return -1;
}
error = __io_seek ((file_t) cookie, *pos, whence, &res);
if (error)
return __hurd_fail (error);
*pos = res;
return 0;
} }
/* Close the file associated with COOKIE. /* Close the file associated with COOKIE.

View File

@ -1,5 +1,6 @@
/* File descriptors. /* File descriptors.
Copyright (C) 1993,94,95,96,97,98,99,2000,01 Free Software Foundation, Inc. Copyright (C) 1993,94,95,96,97,98,99,2000,01,02
Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -214,9 +215,9 @@ extern error_t _hurd_fd_close (struct hurd_fd *fd);
If successful, stores the amount actually read or written in *NBYTES. */ If successful, stores the amount actually read or written in *NBYTES. */
extern error_t _hurd_fd_read (struct hurd_fd *fd, extern error_t _hurd_fd_read (struct hurd_fd *fd,
void *buf, size_t *nbytes, off_t offset); void *buf, size_t *nbytes, loff_t offset);
extern error_t _hurd_fd_write (struct hurd_fd *fd, extern error_t _hurd_fd_write (struct hurd_fd *fd,
const void *buf, size_t *nbytes, off_t offset); const void *buf, size_t *nbytes, loff_t offset);
/* Call *RPC on PORT and/or CTTY; if a call on CTTY returns EBACKGROUND, /* Call *RPC on PORT and/or CTTY; if a call on CTTY returns EBACKGROUND,

View File

@ -1,5 +1,5 @@
/* hairy bits of Hurd file name lookup /* hairy bits of Hurd file name lookup
Copyright (C) 1992,93,94,95,96,97,99,2001 Free Software Foundation, Inc. Copyright (C) 1992,93,94,95,96,97,99,2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -136,7 +136,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
we follow root-owned symlinks; if that is deemed we follow root-owned symlinks; if that is deemed
undesireable, we can add a final check for that undesireable, we can add a final check for that
one exception to our general translator-based rule. */ one exception to our general translator-based rule. */
struct stat st; struct stat64 st;
err = __io_stat (*result, &st); err = __io_stat (*result, &st);
if (!err if (!err
&& (st.st_mode & (S_IPTRANS|S_IATRANS))) && (st.st_mode & (S_IPTRANS|S_IATRANS)))

View File

@ -30,6 +30,9 @@ extern int __pipe (int __pipedes[2]);
extern unsigned int __sleep (unsigned int __seconds); extern unsigned int __sleep (unsigned int __seconds);
extern int __chown (__const char *__file, extern int __chown (__const char *__file,
__uid_t __owner, __gid_t __group); __uid_t __owner, __gid_t __group);
extern int __chown_internal (__const char *__file,
__uid_t __owner, __gid_t __group)
attribute_hidden;
extern int __fchown (int __fd, extern int __fchown (int __fd,
__uid_t __owner, __gid_t __group); __uid_t __owner, __gid_t __group);
extern int __lchown (__const char *__file, __uid_t __owner, extern int __lchown (__const char *__file, __uid_t __owner,

View File

@ -52,8 +52,8 @@ hppa.*-.*-.* libc=6 GLIBC_2.2
# libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release. # libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
.*-.*-gnu-gnu.* libmachuser=1 .*-.*-gnu-gnu.* libmachuser=1
# libhurduser.so.0.0 corresponds to hurd/*.defs as of 7 May 1996. # libhurduser.so.0.3 corresponds to hurd/*.defs as of 11 June 2002.
.*-.*-gnu-gnu.* libhurduser=0.0 .*-.*-gnu-gnu.* libhurduser=0.3
# libc.so.0.3 is the first Hurd libc using libio. # libc.so.0.3 is the first Hurd libc using libio.
.*-.*-gnu-gnu.* libc=0.3 .*-.*-gnu-gnu.* libc=0.3

View File

@ -1,52 +0,0 @@
/* Copyright (C) 1991,1993,1996-1999,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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 <stdio.h>
#include <unistd.h>
#ifdef USE_IN_LIBIO
# include <iolibio.h>
# define __fdopen INTUSE(_IO_fdopen)
#endif
/* This returns a new stream opened on a temporary file (generated
by tmpnam) The file is opened with mode "w+b" (binary read/write).
If we couldn't generate a unique filename or the file couldn't
be opened, NULL is returned. */
FILE *
tmpfile64 ()
{
char buf[FILENAME_MAX];
int fd;
FILE *f;
if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0))
return NULL;
fd = __gen_tempname (buf, __GT_BIGFILE);
if (fd < 0)
return NULL;
/* Note that this relies on the Unix semantics that
a file is not really removed until it is closed. */
(void) remove (buf);
if ((f = __fdopen (fd, "w+b")) == NULL)
__close (fd);
return f;
}

View File

@ -26,6 +26,10 @@
# define tmpfile __new_tmpfile # define tmpfile __new_tmpfile
#endif #endif
#ifndef GEN_THIS
# define GEN_THIS __GT_FILE
#endif
/* This returns a new stream opened on a temporary file (generated /* This returns a new stream opened on a temporary file (generated
by tmpnam). The file is opened with mode "w+b" (binary read/write). by tmpnam). The file is opened with mode "w+b" (binary read/write).
If we couldn't generate a unique filename or the file couldn't If we couldn't generate a unique filename or the file couldn't
@ -39,7 +43,7 @@ tmpfile (void)
if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0)) if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0))
return NULL; return NULL;
fd = __gen_tempname (buf, __GT_FILE); fd = __gen_tempname (buf, GEN_THIS);
if (fd < 0) if (fd < 0)
return NULL; return NULL;

View File

@ -0,0 +1,3 @@
#define GEN_THIS __GT_BIGFILE
#define tmpfile tmpfile64
#include "tmpfile.c"

View File

@ -20,11 +20,45 @@ case "$machine" in
;; ;;
esac esac
echo $ac_n "checking Hurd header version""... $ac_c" 1>&6
echo "configure:25: checking Hurd header version" >&5
if eval "test \"`echo '$''{'libc_cv_hurd_version'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 30 "configure"
#include "confdefs.h"
#include <hurd/version.h>
int main() {
#define NEED_VERSION 20020609
#if HURD_INTERFACE_VERSION < NEED_VERSION
# error Hurd version too old: HURD_INTERFACE_VERSION < NEED_VERSION
#endif
; return 0; }
EOF
if { (eval echo configure:41: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
libc_cv_hurd_version=ok
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
libc_cv_hurd_version=bad
fi
rm -f conftest*
fi
echo "$ac_t""$libc_cv_hurd_version" 1>&6
if test "x$libc_cv_hurd_version" != xok; then
{ echo "configure: error: Hurd headers not installed or too old" 1>&2; exit 1; }
fi
# See if mig groks `retcode'. # See if mig groks `retcode'.
echo $ac_n "checking whether $MIG supports the retcode keyword""... $ac_c" 1>&6 echo $ac_n "checking whether $MIG supports the retcode keyword""... $ac_c" 1>&6
echo "configure:28: checking whether $MIG supports the retcode keyword" >&5 echo "configure:62: checking whether $MIG supports the retcode keyword" >&5
if eval "test \"`echo '$''{'hurd_cv_mig_retcode'+set}'`\" = set"; then if eval "test \"`echo '$''{'hurd_cv_mig_retcode'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -38,7 +72,7 @@ simpleroutine foobar_reply (
reply_port: reply_port_t; reply_port: reply_port_t;
err: kern_return_t, RetCode); err: kern_return_t, RetCode);
EOF EOF
if { ac_try='CC="${CC}" ${MIG-false} -n conftest.defs 1>&5'; { (eval echo configure:42: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then if { ac_try='CC="${CC}" ${MIG-false} -n conftest.defs 1>&5'; { (eval echo configure:76: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
hurd_cv_mig_retcode=yes hurd_cv_mig_retcode=yes
else else
hurd_cv_mig_retcode=no hurd_cv_mig_retcode=no

View File

@ -22,6 +22,19 @@ case "$machine" in
;; ;;
esac esac
AC_CACHE_CHECK(Hurd header version, libc_cv_hurd_version, [dnl
AC_TRY_COMPILE(dnl
[#include <hurd/version.h>], [
#define NEED_VERSION 20020609
#if HURD_INTERFACE_VERSION < NEED_VERSION
# error Hurd version too old: HURD_INTERFACE_VERSION < NEED_VERSION
#endif],
libc_cv_hurd_version=ok,
libc_cv_hurd_version=bad)])
if test "x$libc_cv_hurd_version" != xok; then
AC_MSG_ERROR(Hurd headers not installed or too old)
fi
dnl Swiped from hurd/aclocal.m4 dnl Swiped from hurd/aclocal.m4
AC_DEFUN([hurd_MIG_RETCODE], [dnl AC_DEFUN([hurd_MIG_RETCODE], [dnl
# See if mig groks `retcode'. # See if mig groks `retcode'.

View File

@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Hurd version. /* Operating system support for run-time dynamic linker. Hurd version.
Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. Copyright (C) 1995,96,97,98,99,2000,01,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -280,7 +280,7 @@ _dl_sysdep_start_cleanup (void)
error. If STAT is non-zero, stat the file into that stat buffer. */ error. If STAT is non-zero, stat the file into that stat buffer. */
static error_t static error_t
open_file (const char *file_name, int flags, open_file (const char *file_name, int flags,
mach_port_t *port, struct stat *stat) mach_port_t *port, struct stat64 *stat)
{ {
enum retry_type doretry; enum retry_type doretry;
char retryname[1024]; /* XXX string_t LOSES! */ char retryname[1024]; /* XXX string_t LOSES! */
@ -417,8 +417,8 @@ __writev (int fd, const struct iovec *iov, int niov)
} }
off_t weak_function off64_t weak_function
__lseek (int fd, off_t offset, int whence) __libc_lseek64 (int fd, off64_t offset, int whence)
{ {
error_t err; error_t err;
@ -491,7 +491,7 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
} }
int weak_function int weak_function
__fxstat (int vers, int fd, struct stat *buf) __fxstat64 (int vers, int fd, struct stat64 *buf)
{ {
error_t err; error_t err;
@ -505,7 +505,7 @@ __fxstat (int vers, int fd, struct stat *buf)
} }
int weak_function int weak_function
__xstat (int vers, const char *file, struct stat *buf) __xstat64 (int vers, const char *file, struct stat64 *buf)
{ {
error_t err; error_t err;
mach_port_t port; mach_port_t port;

View File

@ -1,5 +1,5 @@
/* fstatfs -- Return information about the filesystem on which FD resides. /* fstatfs -- Return information about the filesystem on which FD resides.
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,21 +17,16 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <hurd.h>
#include <hurd/fd.h>
#include <sys/statfs.h> #include <sys/statfs.h>
#include <stddef.h>
#include "statfsconv.c"
/* Return information about the filesystem on which FD resides. */ /* Return information about the filesystem on which FD resides. */
int int
__fstatfs (int fd, struct statfs *buf) __fstatfs (int fd, struct statfs *buf)
{ {
error_t err; struct statfs64 buf64;
return __fstatfs64 (fd, &buf64) ?: statfs64_conv (buf, &buf64);
if (err = HURD_DPORT_USE (fd, __file_statfs (port, buf)))
return __hurd_dfail (fd, err);
return 0;
} }
weak_alias (__fstatfs, fstatfs) weak_alias (__fstatfs, fstatfs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,6 +17,8 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sys/statfs.h> #include <sys/statfs.h>
#include <hurd.h>
#include <hurd/fd.h>
#include "statfsconv.c" #include "statfsconv.c"
@ -24,17 +26,11 @@
int int
__fstatfs64 (int fd, struct statfs64 *buf) __fstatfs64 (int fd, struct statfs64 *buf)
{ {
int result; error_t err;
struct statfs buf32;
/* XXX We simply call __fstatfs and convert the result to `struct if (err = HURD_DPORT_USE (fd, __file_statfs (port, buf)))
statfs64'. We can probably get away with that since we don't return __hurd_dfail (fd, err);
support large files on the Hurd yet. */
result = __fstatfs (fd, &buf32);
if (result == 0)
statfs64_conv (&buf32, buf);
return result; return 0;
} }
weak_alias (__fstatfs64, fstatfs64) weak_alias (__fstatfs64, fstatfs64)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992, 93, 94, 95, 96, 97, 2002 Free Software Foundation, Inc. /* Copyright (C) 1992,93,94,95,96,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,8 +19,8 @@
#include <errno.h> #include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <hurd.h>
#include <hurd/fd.h> #include "xstatconv.c"
#undef __fxstat #undef __fxstat
@ -28,15 +28,8 @@
int int
__fxstat (int vers, int fd, struct stat *buf) __fxstat (int vers, int fd, struct stat *buf)
{ {
error_t err; struct stat64 buf64;
return __fxstat64 (vers, fd, &buf64) ?: xstat64_conv (buf, &buf64);
if (vers != _STAT_VER)
return __hurd_fail (EINVAL);
if (err = HURD_DPORT_USE (fd, __io_stat (port, buf)))
return __hurd_dfail (fd, err);
return 0;
} }
INTDEF(__fxstat) INTDEF(__fxstat)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. /* Copyright (C) 2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,11 +16,13 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#ifndef RTLD_STAT64 /* dl-fxstat64.c, but we don't want it. */
#include <errno.h> #include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <hurd.h>
#include "xstatconv.c" #include <hurd/fd.h>
#undef __fxstat64 #undef __fxstat64
@ -28,17 +30,17 @@
int int
__fxstat64 (int vers, int fd, struct stat64 *buf) __fxstat64 (int vers, int fd, struct stat64 *buf)
{ {
int result; error_t err;
struct stat buf32;
/* XXX We simply call __fxstat and convert the result to `struct if (vers != _STAT_VER)
stat64'. We can probably get away with that since we don't return __hurd_fail (EINVAL);
support large files on the Hurd yet. */
result = __fxstat (vers, fd, &buf32);
if (result == 0)
xstat64_conv (&buf32, buf);
return result; if (err = HURD_DPORT_USE (fd, __io_stat (port, buf)))
return __hurd_dfail (fd, err);
return 0;
} }
INTDEF(__fxstat64) INTDEF(__fxstat64)
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. /* Copyright (C) 1991,92,93,94,95,96,97,98,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -44,7 +44,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir,
{ {
error_t err; error_t err;
mach_port_t rootid, thisid, rootdevid, thisdevid; mach_port_t rootid, thisid, rootdevid, thisdevid;
ino_t rootino, thisino; ino64_t rootino, thisino;
char *file_name; char *file_name;
register char *file_namep; register char *file_namep;
file_t parent; file_t parent;
@ -112,9 +112,9 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir,
THISID, THISDEV, and THISINO are its identity. THISID, THISDEV, and THISINO are its identity.
Look in its parent (..) for a file with the same file number. */ Look in its parent (..) for a file with the same file number. */
struct dirent *d; struct dirent64 *d;
mach_port_t dotid, dotdevid; mach_port_t dotid, dotdevid;
ino_t dotino; ino64_t dotino;
int mount_point; int mount_point;
file_t newp; file_t newp;
char *dirdata; char *dirdata;
@ -175,7 +175,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir,
offset = 0; offset = 0;
while (offset < dirdatasize) while (offset < dirdatasize)
{ {
d = (struct dirent *) &dirdata[offset]; d = (struct dirent64 *) &dirdata[offset];
offset += d->d_reclen; offset += d->d_reclen;
/* Ignore `.' and `..'. */ /* Ignore `.' and `..'. */
@ -189,7 +189,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir,
file_t try = __file_name_lookup_under (parent, d->d_name, file_t try = __file_name_lookup_under (parent, d->d_name,
O_NOLINK, 0); O_NOLINK, 0);
file_t id, devid; file_t id, devid;
ino_t fileno; ino64_t fileno;
if (try == MACH_PORT_NULL) if (try == MACH_PORT_NULL)
goto lose; goto lose;
err = __io_identity (try, &id, &devid, &fileno); err = __io_identity (try, &id, &devid, &fileno);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991,92,93,94,95,97,2000 Free Software Foundation, Inc. /* Copyright (C) 1991,92,93,94,95,97,2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,19 +16,14 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <hurd.h> #include <sys/types.h>
#include <hurd/fd.h>
/* Seek to OFFSET on FD, starting from WHENCE. */ /* Seek to OFFSET on FD, starting from WHENCE. */
off_t off_t
__libc_lseek (int fd, off_t offset, int whence) __libc_lseek (int fd, off_t offset, int whence)
{ {
error_t err; return __libc_lseek64 (fd, (off64_t) offset, whence);
if (err = HURD_DPORT_USE (fd, __io_seek (port, offset, whence, &offset)))
return __hurd_dfail (fd, err);
return offset;
} }
weak_alias (__libc_lseek, __lseek) weak_alias (__libc_lseek, __lseek)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000 Free Software Foundation, Inc. /* Copyright (C) 2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,25 +16,18 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <hurd.h>
#include <hurd/fd.h>
/* Seek to OFFSET on FD, starting from WHENCE. */ /* Seek to OFFSET on FD, starting from WHENCE. */
off64_t off64_t
__libc_lseek64 (int fd, off64_t offset, int whence) __libc_lseek64 (int fd, off64_t offset, int whence)
{ {
/* XXX We don't really support large files on the Hurd. So if error_t err;
OFFSET doesn't fit in an `off_t', we'll return `-1' and set if (err = HURD_DPORT_USE (fd, __io_seek (port, offset, whence, &offset)))
errno. EOVERFLOW probably isn't the right error value, but seems return __hurd_dfail (fd, err);
appropriate here. */ return offset;
if ((off_t) offset != offset)
{
__set_errno (EOVERFLOW);
return -1;
}
return __libc_lseek (fd, offset, whence);
} }
weak_alias (__libc_lseek64, __lseek64) weak_alias (__libc_lseek64, __lseek64)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992, 93, 94, 95, 96, 97, 2002 Free Software Foundation, Inc. /* Copyright (C) 1992,93,94,95,96,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,28 +19,16 @@
#include <errno.h> #include <errno.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stddef.h> #include <stddef.h>
#include <fcntl.h>
#include <hurd.h> #include "xstatconv.c"
#undef __lxstat #undef __lxstat
int int
__lxstat (int vers, const char *file, struct stat *buf) __lxstat (int vers, const char *file, struct stat *buf)
{ {
error_t err; struct stat64 buf64;
file_t port; return __lxstat64 (vers, file, &buf64) ?: xstat64_conv (buf, &buf64);
if (vers != _STAT_VER)
return __hurd_fail (EINVAL);
port = __file_name_lookup (file, O_NOLINK, 0);
if (port == MACH_PORT_NULL)
return -1;
err = __io_stat (port, buf);
__mach_port_deallocate (__mach_task_self (), port);
if (err)
return __hurd_fail (err);
return 0;
} }
INTDEF(__lxstat) INTDEF(__lxstat)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. /* Copyright (C) 2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,8 +19,8 @@
#include <errno.h> #include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h>
#include "xstatconv.c" #include <hurd.h>
#undef __lxstat64 #undef __lxstat64
@ -28,16 +28,19 @@
int int
__lxstat64 (int vers, const char *file, struct stat64 *buf) __lxstat64 (int vers, const char *file, struct stat64 *buf)
{ {
int result; error_t err;
struct stat buf32; file_t port;
/* XXX We simply call __lxstat and convert the result to `struct if (vers != _STAT_VER)
stat64'. We can probably get away with that since we don't return __hurd_fail (EINVAL);
support large files on the Hurd yet. */
result = __lxstat (vers, file, &buf32);
if (result == 0)
xstat64_conv (&buf32, buf);
return result; port = __file_name_lookup (file, O_NOLINK, 0);
if (port == MACH_PORT_NULL)
return -1;
err = __io_stat (port, buf);
__mach_port_deallocate (__mach_task_self (), port);
if (err)
return __hurd_fail (err);
return 0;
} }
INTDEF(__lxstat64) INTDEF(__lxstat64)

View File

@ -1,6 +1,6 @@
/* Read block from given position in file without changing file pointer. /* Read block from given position in file without changing file pointer.
Hurd version. Hurd version.
Copyright (C) 1999,2001 Free Software Foundation, Inc. Copyright (C) 1999,2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,17 +20,11 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <hurd/fd.h>
ssize_t ssize_t
__libc_pread (int fd, void *buf, size_t nbytes, off_t offset) __libc_pread (int fd, void *buf, size_t nbytes, off_t offset)
{ {
error_t err; return __libc_pread64 (fd, buf, nbytes, (off64_t) offset);
if (offset < 0)
err = EINVAL;
else
err = HURD_FD_USE (fd, _hurd_fd_read (descriptor, buf, &nbytes, offset));
return err ? __hurd_dfail (fd, err) : nbytes;
} }
#ifndef __libc_pread #ifndef __libc_pread

View File

@ -1,6 +1,6 @@
/* Read block from given position in file without changing file pointer. /* Read block from given position in file without changing file pointer.
Hurd version. Hurd version.
Copyright (C) 2001 Free Software Foundation, Inc. Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,21 +20,17 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <hurd/fd.h>
ssize_t ssize_t
__libc_pread64 (int fd, void *buf, size_t nbyte, off64_t offset) __libc_pread64 (int fd, void *buf, size_t nbytes, off64_t offset)
{ {
/* XXX We don't really support large files on the Hurd. So if error_t err;
OFFSET doesn't fit in an `off_t', we'll return `-1' and set if (offset < 0)
errno. EOVERFLOW probably isn't the right error value, but seems err = EINVAL;
appropriate here. */ else
if ((off_t) offset != offset) err = HURD_FD_USE (fd, _hurd_fd_read (descriptor, buf, &nbytes, offset));
{ return err ? __hurd_dfail (fd, err) : nbytes;
__set_errno (EOVERFLOW);
return -1;
}
return __libc_pread (fd, buf, nbyte, offset);
} }
#ifndef __libc_pread64 #ifndef __libc_pread64

View File

@ -1,6 +1,6 @@
/* Write block at given position in file without changing file pointer. /* Write block at given position in file without changing file pointer.
Hurd version. Hurd version.
Copyright (C) 1999,2001 Free Software Foundation, Inc. Copyright (C) 1999,2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,19 +20,13 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <hurd/fd.h>
/* Write NBYTES of BUF to FD at given position OFFSET without changing /* Write NBYTES of BUF to FD at given position OFFSET without changing
the file position. Return the number written, or -1. */ the file position. Return the number written, or -1. */
ssize_t ssize_t
__libc_pwrite (int fd, const void *buf, size_t nbytes, off_t offset) __libc_pwrite (int fd, const void *buf, size_t nbytes, off_t offset)
{ {
error_t err; return __libc_pwrite64 (fd, buf, nbytes, (off64_t) offset);
if (offset < 0)
err = EINVAL;
else
err = HURD_FD_USE (fd, _hurd_fd_write (descriptor, buf, &nbytes, offset));
return err ? __hurd_dfail (fd, err) : nbytes;
} }
#ifndef __libc_pwrite #ifndef __libc_pwrite

View File

@ -1,6 +1,6 @@
/* Write block to given position in file without changing file pointer. /* Write block to given position in file without changing file pointer.
Hurd version. Hurd version.
Copyright (C) 2001 Free Software Foundation, Inc. Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,21 +20,17 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <hurd/fd.h>
ssize_t ssize_t
__libc_pwrite64 (int fd, const void *buf, size_t nbyte, off64_t offset) __libc_pwrite64 (int fd, const void *buf, size_t nbytes, off64_t offset)
{ {
/* XXX We don't really support large files on the Hurd. So if error_t err;
OFFSET doesn't fit in an `off_t', we'll return `-1' and set if (offset < 0)
errno. EOVERFLOW probably isn't the right error value, but seems err = EINVAL;
appropriate here. */ else
if ((off_t) offset != offset) err = HURD_FD_USE (fd, _hurd_fd_write (descriptor, buf, &nbytes, offset));
{ return err ? __hurd_dfail (fd, err) : nbytes;
__set_errno (EOVERFLOW);
return -1;
}
return __libc_pwrite (fd, buf, nbyte, offset);
} }
#ifndef __libc_pwrite64 #ifndef __libc_pwrite64

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1993,94,95,96,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,90 +17,51 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h> #include <errno.h>
#include <limits.h>
#include <stddef.h> #include <stddef.h>
#include <string.h>
#include <dirent.h> #include <dirent.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <endian.h>
#include <hurd.h> #include <assert.h>
#include <hurd/fd.h>
#include "dirstream.h"
/* Read a directory entry from DIRP. */ /* Read a directory entry from DIRP. */
struct dirent * struct dirent *
__readdir (DIR *dirp) __readdir (DIR *dirp)
{ {
struct dirent *dp; struct dirent64 *entry64 = __readdir64 (dirp);
if (dirp == NULL) if (sizeof (struct dirent64) == sizeof (struct dirent))
/* We should in fact just be an alias to readdir64 on this machine. */
return (struct dirent *) entry64;
/* These are all compile-time constants. We know that d_ino is the first
member and that the layout of the following members matches exactly in
both structures. */
assert (offsetof (struct dirent, d_ino) == 0);
assert (offsetof (struct dirent64, d_ino) == 0);
# define MATCH(memb) \
assert (offsetof (struct dirent64, memb) - sizeof (entry64->d_ino) \
== offsetof (struct dirent, memb) - sizeof (ino_t))
MATCH (d_reclen);
MATCH (d_type);
MATCH (d_namlen);
# undef MATCH
if (entry64 == NULL)
return NULL;
struct dirent *const entry = ((void *) (&entry64->d_ino + 1)
- sizeof entry->d_ino);
const ino_t d_ino = entry64->d_ino;
if (d_ino != entry64->d_ino)
{ {
errno = EINVAL; __set_errno (EOVERFLOW);
return NULL; return NULL;
} }
# if BYTE_ORDER != BIG_ENDIAN /* We just skipped over the zero high word. */
__libc_lock_lock (dirp->__lock); entry->d_ino = d_ino; /* ... or the nonzero low word, swap it. */
# endif
do entry->d_reclen -= sizeof entry64->d_ino - sizeof entry->d_ino;
{ return entry;
if (dirp->__ptr - dirp->__data >= dirp->__size)
{
/* We've emptied out our buffer. Refill it. */
char *data = dirp->__data;
int nentries;
error_t err;
if (err = HURD_FD_PORT_USE (dirp->__fd,
__dir_readdir (port,
&data, &dirp->__size,
dirp->__entry_ptr,
-1, 0, &nentries)))
{
__hurd_fail (err);
dp = NULL;
break;
}
/* DATA now corresponds to entry index DIRP->__entry_ptr. */
dirp->__entry_data = dirp->__entry_ptr;
if (data != dirp->__data)
{
/* The data was passed out of line, so our old buffer is no
longer useful. Deallocate the old buffer and reset our
information for the new buffer. */
__vm_deallocate (__mach_task_self (),
(vm_address_t) dirp->__data,
dirp->__allocation);
dirp->__data = data;
dirp->__allocation = round_page (dirp->__size);
}
/* Reset the pointer into the buffer. */
dirp->__ptr = dirp->__data;
if (nentries == 0)
{
/* End of file. */
dp = NULL;
break;
}
/* We trust the filesystem to return correct data and so we
ignore NENTRIES. */
}
dp = (struct dirent *) dirp->__ptr;
dirp->__ptr += dp->d_reclen;
++dirp->__entry_ptr;
/* Loop to ignore deleted files. */
} while (dp->d_fileno == 0);
__libc_lock_unlock (dirp->__lock);
return dp;
} }
weak_alias (__readdir, readdir) weak_alias (__readdir, readdir)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,25 +17,86 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <dirent.h> #include <dirent.h>
#include <limits.h>
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <hurd.h>
#include <hurd/fs.h>
#include <hurd/fd.h>
#include "dirstream.h"
/* Read a directory entry from DIRP. */ /* Read a directory entry from DIRP. */
struct dirent64 * struct dirent64 *
__readdir64 (DIR *dirp) __readdir64 (DIR *dirp)
{ {
struct dirent64 *result; struct dirent64 *dp;
static union
{
struct dirent64 d;
char b[offsetof (struct dirent64, d_name) + UCHAR_MAX + 1];
} u;
int err;
err = __readdir64_r (dirp, &u.d, &result); if (dirp == NULL)
{
errno = EINVAL;
return NULL;
}
return err ? NULL : result; __libc_lock_lock (dirp->__lock);
do
{
if (dirp->__ptr - dirp->__data >= dirp->__size)
{
/* We've emptied out our buffer. Refill it. */
char *data = dirp->__data;
int nentries;
error_t err;
if (err = HURD_FD_PORT_USE (dirp->__fd,
__dir_readdir (port,
&data, &dirp->__size,
dirp->__entry_ptr,
-1, 0, &nentries)))
{
__hurd_fail (err);
dp = NULL;
break;
}
/* DATA now corresponds to entry index DIRP->__entry_ptr. */
dirp->__entry_data = dirp->__entry_ptr;
if (data != dirp->__data)
{
/* The data was passed out of line, so our old buffer is no
longer useful. Deallocate the old buffer and reset our
information for the new buffer. */
__vm_deallocate (__mach_task_self (),
(vm_address_t) dirp->__data,
dirp->__allocation);
dirp->__data = data;
dirp->__allocation = round_page (dirp->__size);
}
/* Reset the pointer into the buffer. */
dirp->__ptr = dirp->__data;
if (nentries == 0)
{
/* End of file. */
dp = NULL;
break;
}
/* We trust the filesystem to return correct data and so we
ignore NENTRIES. */
}
dp = (struct dirent64 *) dirp->__ptr;
dirp->__ptr += dp->d_reclen;
++dirp->__entry_ptr;
/* Loop to ignore deleted files. */
} while (dp->d_fileno == 0);
__libc_lock_unlock (dirp->__lock);
return dp;
} }
weak_alias (__readdir64, readdir64) weak_alias (__readdir64, readdir64)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,36 +17,96 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <dirent.h> #include <dirent.h>
#include <limits.h>
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include <hurd.h>
#include <hurd/fs.h>
#include <hurd/fd.h>
#include "dirstream.h"
/* Read a directory entry from DIRP. */ /* Read a directory entry from DIRP. */
int int
__readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result) __readdir64_r (DIR *dirp, struct dirent64 *entry, struct dirent64 **result)
{ {
struct dirent *result32; struct dirent64 *dp;
union error_t err = 0;
{
struct dirent d;
char b[offsetof (struct dirent, d_name) + UCHAR_MAX + 1];
} u;
int err;
err = __readdir_r (dirp, &u.d, &result32); if (dirp == NULL)
if (result32)
{ {
entry->d_fileno = result32->d_fileno; errno = EINVAL;
entry->d_reclen = result32->d_reclen; return errno;
entry->d_type = result32->d_type; }
entry->d_namlen = result32->d_namlen;
memcpy (entry->d_name, result32->d_name, result32->d_namlen + 1); __libc_lock_lock (dirp->__lock);
do
{
if (dirp->__ptr - dirp->__data >= dirp->__size)
{
/* We've emptied out our buffer. Refill it. */
char *data = dirp->__data;
int nentries;
if (err = HURD_FD_PORT_USE (dirp->__fd,
__dir_readdir (port,
&data, &dirp->__size,
dirp->__entry_ptr,
-1, 0, &nentries)))
{
__hurd_fail (err);
dp = NULL;
break;
}
/* DATA now corresponds to entry index DIRP->__entry_ptr. */
dirp->__entry_data = dirp->__entry_ptr;
if (data != dirp->__data)
{
/* The data was passed out of line, so our old buffer is no
longer useful. Deallocate the old buffer and reset our
information for the new buffer. */
__vm_deallocate (__mach_task_self (),
(vm_address_t) dirp->__data,
dirp->__allocation);
dirp->__data = data;
dirp->__allocation = round_page (dirp->__size);
}
/* Reset the pointer into the buffer. */
dirp->__ptr = dirp->__data;
if (nentries == 0)
{
/* End of file. */
dp = NULL;
break;
}
/* We trust the filesystem to return correct data and so we
ignore NENTRIES. */
}
dp = (struct dirent64 *) dirp->__ptr;
dirp->__ptr += dp->d_reclen;
++dirp->__entry_ptr;
/* Loop to ignore deleted files. */
} while (dp->d_fileno == 0);
if (dp)
{
*entry = *dp;
memcpy (entry->d_name, dp->d_name, dp->d_namlen + 1);
*result = entry; *result = entry;
} }
else else
*result = NULL; *result = NULL;
return err; __libc_lock_unlock (dirp->__lock);
return dp ? 0 : err ? errno : 0;
} }
weak_alias(__readdir64_r, readdir64_r) weak_alias(__readdir64_r, readdir64_r)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 94, 95, 96, 1997, 2001 Free Software Foundation, Inc. /* Copyright (C) 1993,94,95,96,97,2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -32,85 +32,34 @@
int int
__readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result) __readdir_r (DIR *dirp, struct dirent *entry, struct dirent **result)
{ {
struct dirent *dp; if (sizeof (struct dirent64) == sizeof (struct dirent))
error_t err = 0; /* We should in fact just be an alias to readdir64_r on this machine. */
return __readdir64_r (dirp,
(struct dirent64 *) entry,
(struct dirent64 **) result);
if (dirp == NULL) struct dirent64 *result64;
union
{
struct dirent64 d;
char b[offsetof (struct dirent64, d_name) + UCHAR_MAX + 1];
} u;
int err;
err = __readdir64_r (dirp, &u.d, &result64);
if (result64)
{ {
errno = EINVAL; entry->d_fileno = result64->d_fileno;
return errno; entry->d_reclen = result64->d_reclen;
} entry->d_type = result64->d_type;
entry->d_namlen = result64->d_namlen;
__libc_lock_lock (dirp->__lock); memcpy (entry->d_name, result64->d_name, result64->d_namlen + 1);
do
{
if (dirp->__ptr - dirp->__data >= dirp->__size)
{
/* We've emptied out our buffer. Refill it. */
char *data = dirp->__data;
int nentries;
if (err = HURD_FD_PORT_USE (dirp->__fd,
__dir_readdir (port,
&data, &dirp->__size,
dirp->__entry_ptr,
-1, 0, &nentries)))
{
__hurd_fail (err);
dp = NULL;
break;
}
/* DATA now corresponds to entry index DIRP->__entry_ptr. */
dirp->__entry_data = dirp->__entry_ptr;
if (data != dirp->__data)
{
/* The data was passed out of line, so our old buffer is no
longer useful. Deallocate the old buffer and reset our
information for the new buffer. */
__vm_deallocate (__mach_task_self (),
(vm_address_t) dirp->__data,
dirp->__allocation);
dirp->__data = data;
dirp->__allocation = round_page (dirp->__size);
}
/* Reset the pointer into the buffer. */
dirp->__ptr = dirp->__data;
if (nentries == 0)
{
/* End of file. */
dp = NULL;
break;
}
/* We trust the filesystem to return correct data and so we
ignore NENTRIES. */
}
dp = (struct dirent *) dirp->__ptr;
dirp->__ptr += dp->d_reclen;
++dirp->__entry_ptr;
/* Loop to ignore deleted files. */
} while (dp->d_fileno == 0);
if (dp)
{
*entry = *dp;
memcpy (entry->d_name, dp->d_name, dp->d_namlen + 1);
*result = entry; *result = entry;
} }
else else
*result = NULL; *result = NULL;
__libc_lock_unlock (dirp->__lock); return err;
return dp ? 0 : err ? errno : 0;
} }
weak_alias (__readdir_r, readdir_r) weak_alias (__readdir_r, readdir_r)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. /* Copyright (C) 1991,92,93,94,95,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,7 +33,7 @@ __readlink (file_name, buf, len)
{ {
error_t err; error_t err;
file_t file; file_t file;
struct stat st; struct stat64 st;
file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0);
if (file == MACH_PORT_NULL) if (file == MACH_PORT_NULL)

View File

@ -18,43 +18,20 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sys/sendfile.h> #include <sys/sendfile.h>
#include <hurd.h> #include <stddef.h>
#include <hurd/fd.h>
#include <sys/mman.h>
/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to /* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
descriptor OUT_FD. */ descriptor OUT_FD. */
ssize_t ssize_t
sendfile (int out_fd, int in_fd, off_t *offset, size_t count) sendfile (int out_fd, int in_fd, off_t *offset, size_t count)
{ {
/* We just do a vanilla io_read followed by a vanilla io_write here. if (offset == NULL || sizeof (off_t) == sizeof (off64_t))
In theory the IN_FD filesystem can return us out-of-line data that return sendfile64 (out_fd, in_fd, (off64_t *) offset, count);
we then send out-of-line to the OUT_FD filesystem and no copying else
takes place until those pages need to be flushed or packaged by
that filesystem (e.g. packetized by a network socket). However,
we momentarily consume COUNT bytes of our local address space,
which might blow if it's huge or address space is real tight. */
char *data = 0;
size_t datalen = 0;
error_t err = HURD_DPORT_USE (in_fd,
__io_read (port, &data, &datalen,
offset ? *offset : (off_t) -1,
count));
if (err == 0)
{ {
size_t nwrote; off64_t ofs = *offset;
if (datalen == 0) ssize_t ret = sendfile64 (out_fd, in_fd, &ofs, count);
return 0; *offset = ofs;
err = HURD_DPORT_USE (out_fd, __io_write (port, data, datalen, return ret;
(off_t) -1, &nwrote));
munmap (data, datalen);
if (err == 0)
{
if (offset)
*offset += datalen;
return nwrote;
}
} }
return __hurd_fail (err);
} }

View File

@ -18,26 +18,43 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sys/sendfile.h> #include <sys/sendfile.h>
#include <errno.h> #include <hurd.h>
#include <stddef.h> #include <hurd/fd.h>
#include <sys/mman.h>
/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to /* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
descriptor OUT_FD. */ descriptor OUT_FD. */
ssize_t ssize_t
sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count) sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count)
{ {
if (offset == NULL) /* We just do a vanilla io_read followed by a vanilla io_write here.
return sendfile (out_fd, in_fd, NULL, count); In theory the IN_FD filesystem can return us out-of-line data that
else we then send out-of-line to the OUT_FD filesystem and no copying
takes place until those pages need to be flushed or packaged by
that filesystem (e.g. packetized by a network socket). However,
we momentarily consume COUNT bytes of our local address space,
which might blow if it's huge or address space is real tight. */
char *data = 0;
size_t datalen = 0;
error_t err = HURD_DPORT_USE (in_fd,
__io_read (port, &data, &datalen,
offset ? *offset : (off_t) -1,
count));
if (err == 0)
{ {
off_t ofs = *offset; size_t nwrote;
if (ofs != *offset) if (datalen == 0)
return 0;
err = HURD_DPORT_USE (out_fd, __io_write (port, data, datalen,
(off_t) -1, &nwrote));
munmap (data, datalen);
if (err == 0)
{ {
__set_errno (EOVERFLOW); if (offset)
return -1; *offset += datalen;
return nwrote;
} }
ssize_t ret = sendfile (out_fd, in_fd, &ofs, count);
*offset = ofs;
return ret;
} }
return __hurd_fail (err);
} }

View File

@ -1,5 +1,5 @@
/* statfs -- Return information about the filesystem on which FILE resides. /* statfs -- Return information about the filesystem on which FILE resides.
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,25 +17,16 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <hurd.h>
#include <sys/statfs.h> #include <sys/statfs.h>
#include <stddef.h>
#include "statfsconv.c"
/* Return information about the filesystem on which FILE resides. */ /* Return information about the filesystem on which FILE resides. */
int int
__statfs (const char *file, struct statfs *buf) __statfs (const char *file, struct statfs *buf)
{ {
error_t err; struct statfs64 buf64;
file_t port; return __statfs64 (file, &buf64) ?: statfs64_conv (buf, &buf64);
port = __file_name_lookup (file, 0, 0);
if (port == MACH_PORT_NULL)
return -1;
err = __file_statfs (port, buf);
__mach_port_deallocate (__mach_task_self (), port);
if (err)
return __hurd_fail (err);
return 0;
} }
weak_alias (__statfs, statfs) weak_alias (__statfs, statfs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,24 +17,22 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sys/statfs.h> #include <sys/statfs.h>
#include <hurd.h>
#include "statfsconv.c"
/* Return information about the filesystem on which FILE resides. */ /* Return information about the filesystem on which FILE resides. */
int int
__statfs64 (const char *file, struct statfs64 *buf) __statfs64 (const char *file, struct statfs64 *buf)
{ {
int result; error_t err;
struct statfs buf32; file_t port;
/* XXX We simply call __statfs and convert the result to `struct port = __file_name_lookup (file, 0, 0);
statfs64'. We can probably get away with that since we don't if (port == MACH_PORT_NULL)
support large files on the Hurd yet. */ return -1;
result = __statfs (file, &buf32); err = __file_statfs (port, buf);
if (result == 0) __mach_port_deallocate (__mach_task_self (), port);
statfs64_conv (&buf32, buf); if (err)
return __hurd_fail (err);
return result; return 0;
} }
weak_alias (__statfs64, statfs64) weak_alias (__statfs64, statfs64)

View File

@ -1,5 +1,5 @@
/* Convert between `struct statfs' format, and `struct statfs64' format. /* Convert between `struct statfs' format, and `struct statfs64' format.
Copyright (C) 2001 Free Software Foundation, Inc. Copyright (C) 2001,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,23 +17,33 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <string.h> #include <sys/statfs.h>
#include <sys/stat.h> #include <errno.h>
static inline void static inline int
statfs64_conv (struct statfs *buf, struct statfs64 *buf64) statfs64_conv (struct statfs *buf, const struct statfs64 *buf64)
{ {
memset (buf64, 0, sizeof (struct statfs64)); # define DO(memb) \
buf->memb = buf64->memb; \
if (sizeof buf->memb != sizeof buf64->memb && buf->memb != buf64->memb) \
{ \
__set_errno (EOVERFLOW); \
return -1; \
}
buf64->f_type = buf->f_type; DO (f_type);
buf64->f_bsize = buf->f_bsize; DO (f_bsize);
buf64->f_blocks = buf->f_blocks; DO (f_blocks);
buf64->f_bfree = buf->f_bfree; DO (f_bfree);
buf64->f_bavail = buf->f_bavail; DO (f_bavail);
buf64->f_files = buf->f_files; DO (f_files);
buf64->f_fsid = buf->f_fsid; DO (f_fsid);
buf64->f_namelen = buf->f_namelen; DO (f_namelen);
buf64->f_favail = buf->f_favail; DO (f_favail);
buf64->f_frsize = buf->f_frsize; DO (f_frsize);
buf64->f_flag = buf->f_flag; DO (f_flag);
# undef DO
return 0;
} }

View File

@ -26,7 +26,7 @@
#ifdef USE_IN_LIBIO #ifdef USE_IN_LIBIO
# include <iolibio.h> # include <iolibio.h>
# define __fdopen _IO_fdopen # define __fdopen INTUSE(_IO_fdopen)
# define tmpfile __new_tmpfile # define tmpfile __new_tmpfile
#endif #endif
@ -73,3 +73,5 @@ tmpfile (void)
# include <shlib-compat.h> # include <shlib-compat.h>
versioned_symbol (libc, __new_tmpfile, tmpfile, GLIBC_2_1); versioned_symbol (libc, __new_tmpfile, tmpfile, GLIBC_2_1);
#endif #endif
weak_alias (tmpfile, tmpfile64)

View File

@ -0,0 +1 @@
/* tmpfile64 is an alias for tmpfile, defined in tmpfile.c. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc. /* Copyright (C) 1992,93,94,95,96,97,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -18,27 +18,14 @@
#include <errno.h> #include <errno.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stddef.h>
#include <hurd.h> #include "xstatconv.c"
/* Get file information about FILE in BUF. */ /* Get file information about FILE in BUF. */
int int
__xstat (int vers, const char *file, struct stat *buf) __xstat (int vers, const char *file, struct stat *buf)
{ {
error_t err; struct stat64 buf64;
file_t port; return __xstat64 (vers, file, &buf64) ?: xstat64_conv (buf, &buf64);
if (vers != _STAT_VER)
return __hurd_fail (EINVAL);
port = __file_name_lookup (file, 0, 0);
if (port == MACH_PORT_NULL)
return -1;
err = __io_stat (port, buf);
__mach_port_deallocate (__mach_task_self (), port);
if (err)
return __hurd_fail (err);
return 0;
} }
weak_alias (__xstat, _xstat) weak_alias (__xstat, _xstat)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000 Free Software Foundation, Inc. /* Copyright (C) 2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,25 +16,31 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#ifndef RTLD_STAT64 /* dl-xstat64.c, but we don't want it. */
#include <errno.h> #include <errno.h>
#include <stddef.h> #include <stddef.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <hurd.h>
#include "xstatconv.c"
/* Get information about the file descriptor FD in BUF. */ /* Get information about the file descriptor FD in BUF. */
int int
__xstat64 (int vers, const char *file, struct stat64 *buf) __xstat64 (int vers, const char *file, struct stat64 *buf)
{ {
int result; error_t err;
struct stat buf32; file_t port;
/* XXX We simply call __xstat and convert the result to `struct if (vers != _STAT_VER)
stat64'. We can probably get away with that since we don't return __hurd_fail (EINVAL);
support large files on the Hurd yet. */
result = __xstat (vers, file, &buf32);
if (result == 0)
xstat64_conv (&buf32, buf);
return result; port = __file_name_lookup (file, 0, 0);
if (port == MACH_PORT_NULL)
return -1;
err = __io_stat (port, buf);
__mach_port_deallocate (__mach_task_self (), port);
if (err)
return __hurd_fail (err);
return 0;
} }
#endif

View File

@ -1,5 +1,5 @@
/* Convert between `struct stat' format, and `struct stat64' format. /* Convert between `struct stat' format, and `struct stat64' format.
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000,01,02 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,32 +17,52 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <string.h> #include <errno.h>
#include <sys/stat.h> #include <sys/stat.h>
static inline void static inline int
xstat64_conv (struct stat *buf, struct stat64 *buf64) xstat64_conv (struct stat *buf, const struct stat64 *buf64)
{ {
memset (buf64, 0, sizeof (struct stat64)); if (sizeof *buf == sizeof *buf64
&& sizeof buf->st_ino == sizeof buf64->st_ino
&& sizeof buf->st_size == sizeof buf64->st_size
&& sizeof buf->st_blocks == sizeof buf64->st_blocks)
{
*buf = *(struct stat *) buf64;
return 0;
}
buf64->st_fstype = buf->st_fstype; buf->st_fstype = buf64->st_fstype;
buf64->st_fsid = buf->st_fsid; buf->st_fsid = buf64->st_fsid;
buf64->st_ino = buf->st_ino; buf->st_ino = buf64->st_ino;
buf64->st_gen = buf->st_gen; buf->st_gen = buf64->st_gen;
buf64->st_rdev = buf->st_rdev; buf->st_rdev = buf64->st_rdev;
buf64->st_mode = buf->st_mode; buf->st_mode = buf64->st_mode;
buf64->st_nlink = buf->st_nlink; buf->st_nlink = buf64->st_nlink;
buf64->st_uid = buf->st_uid; buf->st_uid = buf64->st_uid;
buf64->st_gid = buf->st_gid; buf->st_gid = buf64->st_gid;
buf64->st_size = buf->st_size; buf->st_size = buf64->st_size;
buf64->st_atime = buf->st_atime; buf->st_atime = buf64->st_atime;
buf64->st_atime_usec = buf->st_atime_usec; buf->st_atime_usec = buf64->st_atime_usec;
buf64->st_mtime = buf->st_mtime; buf->st_mtime = buf64->st_mtime;
buf64->st_mtime_usec = buf->st_mtime_usec; buf->st_mtime_usec = buf64->st_mtime_usec;
buf64->st_ctime = buf->st_ctime; buf->st_ctime = buf64->st_ctime;
buf64->st_ctime_usec = buf->st_ctime_usec; buf->st_ctime_usec = buf64->st_ctime_usec;
buf64->st_blksize = buf->st_blksize; buf->st_blksize = buf64->st_blksize;
buf64->st_blocks = buf->st_blocks; buf->st_blocks = buf64->st_blocks;
buf64->st_author = buf->st_author; buf->st_author = buf64->st_author;
buf64->st_flags = buf->st_flags; buf->st_flags = buf64->st_flags;
if ((sizeof buf->st_ino != sizeof buf64->st_ino
&& buf->st_ino != buf64->st_ino)
|| (sizeof buf->st_size != sizeof buf64->st_size
&& buf->st_size != buf64->st_size)
|| (sizeof buf->st_blocks != sizeof buf64->st_blocks
&& buf->st_blocks != buf64->st_blocks))
{
__set_errno (EOVERFLOW);
return -1;
}
return 0;
} }