diff options
author | Roland McGrath <roland@gnu.org> | 2002-06-11 23:04:51 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-06-11 23:04:51 +0000 |
commit | 337738b77123cbfed07d53c9408eb74109856d0a (patch) | |
tree | b5eba5547489c0efef99967e7f427f4ae4b4e727 /sysdeps/mach/hurd/sendfile64.c | |
parent | 522c33f6bb802f6bf7840c78a5805b6929fd3ccd (diff) | |
download | glibc-337738b77123cbfed07d53c9408eb74109856d0a.tar glibc-337738b77123cbfed07d53c9408eb74109856d0a.tar.gz glibc-337738b77123cbfed07d53c9408eb74109856d0a.tar.bz2 glibc-337738b77123cbfed07d53c9408eb74109856d0a.zip |
* 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>
Diffstat (limited to 'sysdeps/mach/hurd/sendfile64.c')
-rw-r--r-- | sysdeps/mach/hurd/sendfile64.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/sysdeps/mach/hurd/sendfile64.c b/sysdeps/mach/hurd/sendfile64.c index 40ce271efb..1f63d2a2f5 100644 --- a/sysdeps/mach/hurd/sendfile64.c +++ b/sysdeps/mach/hurd/sendfile64.c @@ -18,26 +18,43 @@ 02111-1307 USA. */ #include <sys/sendfile.h> -#include <errno.h> -#include <stddef.h> +#include <hurd.h> +#include <hurd/fd.h> +#include <sys/mman.h> /* Send COUNT bytes from file associated with IN_FD starting at OFFSET to descriptor OUT_FD. */ ssize_t sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count) { - if (offset == NULL) - return sendfile (out_fd, in_fd, NULL, count); - else + /* We just do a vanilla io_read followed by a vanilla io_write here. + In theory the IN_FD filesystem can return us out-of-line data that + 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; - if (ofs != *offset) + size_t nwrote; + 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); - return -1; + if (offset) + *offset += datalen; + return nwrote; } - ssize_t ret = sendfile (out_fd, in_fd, &ofs, count); - *offset = ofs; - return ret; } + return __hurd_fail (err); } |