2002-06-05 Roland McGrath <roland@frob.com>
authorroland <roland>
Wed, 5 Jun 2002 08:56:11 +0000 (08:56 +0000)
committerroland <roland>
Wed, 5 Jun 2002 08:56:11 +0000 (08:56 +0000)
* io/Makefile (routines): Add sendfile and sendfile64.
(headers): Add sys/sendfile.h to the list.
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Don't add it here.
* sysdeps/unix/sysv/linux/sys/sendfile.h: Moved to ...
* io/sys/sendfile.h: ... here.
* sysdeps/generic/sendfile.c: New file.
* sysdeps/generic/sendfile64.c: New file.
* sysdeps/unix/sysv/linux/Versions (GLIBC_2.1, GLIBC_2.3):
Move sendfile, sendfile64 to ...
* io/Versions (GLIBC_2.1, GLIBC_2.3): ... here.
* sysdeps/mach/hurd/sendfile.c: New file.
* sysdeps/mach/hurd/sendfile64.c: New file.

io/Makefile
io/Versions
io/sys/sendfile.h [new file with mode: 0644]
sysdeps/generic/sendfile.c [new file with mode: 0644]
sysdeps/generic/sendfile64.c [new file with mode: 0644]
sysdeps/mach/hurd/sendfile.c [new file with mode: 0644]
sysdeps/mach/hurd/sendfile64.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/Versions
sysdeps/unix/sysv/linux/sys/sendfile.h [deleted file]

index 0c39fa8..f1a619d 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1992-1999, 2000, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1992-1999,2000,01,02 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
@@ -24,7 +24,7 @@ subdir        := io
 headers := sys/stat.h bits/stat.h sys/statfs.h bits/statfs.h sys/vfs.h \
           sys/statvfs.h bits/statvfs.h fcntl.h sys/fcntl.h bits/fcntl.h \
           poll.h sys/poll.h bits/poll.h \
-          utime.h ftw.h fts.h
+          utime.h ftw.h fts.h sys/sendfile.h
 
 routines :=                                                          \
        utime                                                         \
@@ -46,7 +46,8 @@ routines :=                                                         \
        unlink rmdir                                                  \
        ftw ftw64 fts poll                                            \
        posix_fadvise posix_fadvise64                                 \
-       posix_fallocate posix_fallocate64
+       posix_fallocate posix_fallocate64                             \
+       sendfile sendfile64
 
 # These routines will be omitted from the libc shared object.
 # Instead the static object files will be included in a special archive
index eaf25d7..b5626f3 100644 (file)
@@ -76,6 +76,7 @@ libc {
     open64;
 
     # s*
+    sendfile;
     statfs64; statvfs; statvfs64;
   }
   GLIBC_2.2 {
@@ -84,6 +85,10 @@ libc {
 
     __open64;
   }
+  GLIBC_2.3 {
+    # s*
+    sendfile64;
+  }
   GLIBC_PRIVATE {
     # functions which have an additional interface since they are
     # cancelable.
diff --git a/io/sys/sendfile.h b/io/sys/sendfile.h
new file mode 100644 (file)
index 0000000..0627c40
--- /dev/null
@@ -0,0 +1,50 @@
+/* sendfile -- copy data directly from one file descriptor to another
+   Copyright (C) 1998,99,01,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.  */
+
+#ifndef _SYS_SENDFILE_H
+#define _SYS_SENDFILE_H        1
+
+#include <features.h>
+#include <sys/types.h>
+
+__BEGIN_DECLS
+
+/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
+   descriptor OUT_FD.  */
+#ifndef __USE_FILE_OFFSET64
+extern ssize_t sendfile (int __out_fd, int __in_fd, off_t *__offset,
+                        size_t __count) __THROW;
+#else
+# ifdef __REDIRECT
+extern ssize_t __REDIRECT (sendfile,
+                          (int __out_fd, int __in_fd, __off64_t *__offset,
+                           size_t __count) __THROW,
+                          sendfile64);
+# else
+#  define sendfile sendfile64
+# endif
+#endif
+#ifdef __USE_LARGEFILE64
+extern ssize_t sendfile64 (int __out_fd, int __in_fd, __off64_t *__offset,
+                          size_t __count) __THROW;
+#endif
+
+__END_DECLS
+
+#endif /* sys/sendfile.h */
diff --git a/sysdeps/generic/sendfile.c b/sysdeps/generic/sendfile.c
new file mode 100644 (file)
index 0000000..0705493
--- /dev/null
@@ -0,0 +1,32 @@
+/* sendfile -- copy data directly from one file descriptor to another
+   Copyright (C) 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 <sys/sendfile.h>
+
+/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
+   descriptor OUT_FD.  */
+ssize_t
+sendfile (int out_fd, int in_fd, off_t *offset, size_t count)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+stub_warning (sendfile)
+
+#include <stub-tag.h>
diff --git a/sysdeps/generic/sendfile64.c b/sysdeps/generic/sendfile64.c
new file mode 100644 (file)
index 0000000..10643bd
--- /dev/null
@@ -0,0 +1,32 @@
+/* sendfile -- copy data directly from one file descriptor to another
+   Copyright (C) 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 <sys/sendfile.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)
+{
+  __set_errno (ENOSYS);
+  return -1;
+}
+stub_warning (sendfile64)
+
+#include <stub-tag.h>
diff --git a/sysdeps/mach/hurd/sendfile.c b/sysdeps/mach/hurd/sendfile.c
new file mode 100644 (file)
index 0000000..b1849d2
--- /dev/null
@@ -0,0 +1,60 @@
+/* sendfile -- copy data directly from one file descriptor to another
+   Copyright (C) 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 <sys/sendfile.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
+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.
+     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)
+    {
+      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)
+       {
+         if (offset)
+           *offset += datalen;
+         return nwrote;
+       }
+    }
+  return __hurd_fail (err);
+}
diff --git a/sysdeps/mach/hurd/sendfile64.c b/sysdeps/mach/hurd/sendfile64.c
new file mode 100644 (file)
index 0000000..40ce271
--- /dev/null
@@ -0,0 +1,43 @@
+/* sendfile -- copy data directly from one file descriptor to another
+   Copyright (C) 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 <sys/sendfile.h>
+#include <errno.h>
+#include <stddef.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
+    {
+      off_t ofs = *offset;
+      if (ofs != *offset)
+       {
+         __set_errno (EOVERFLOW);
+         return -1;
+       }
+      ssize_t ret = sendfile (out_fd, in_fd, &ofs, count);
+      *offset = ofs;
+      return ret;
+    }
+}
index 9995008..68e9a1e 100644 (file)
@@ -20,7 +20,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
                  sys/kd.h sys/soundcard.h sys/vt.h \
                  sys/quota.h sys/fsuid.h \
                  scsi/sg.h scsi/scsi.h scsi/scsi_ioctl.h sys/pci.h \
-                 sys/ultrasound.h sys/sendfile.h sys/raw.h
+                 sys/ultrasound.h sys/raw.h
 
 install-others += $(inst_includedir)/bits/syscall.h
 
index 2a90387..53cd880 100644 (file)
@@ -73,9 +73,6 @@ libc {
     # n*
     ntp_adjtime; ntp_gettime;
 
-    # s*
-    sendfile;
-
     # u*
     umount2;
   }
@@ -93,8 +90,6 @@ libc {
   GLIBC_2.3 {
     # r*
     readahead;
-    # s*
-    sendfile64;
   }
   GLIBC_PRIVATE {
     # needed by libpthread.
diff --git a/sysdeps/unix/sysv/linux/sys/sendfile.h b/sysdeps/unix/sysv/linux/sys/sendfile.h
deleted file mode 100644 (file)
index 5a6fc77..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1998, 1999, 2001, 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.  */
-
-#ifndef _SYS_SENDFILE_H
-#define _SYS_SENDFILE_H        1
-
-#include <features.h>
-#include <sys/types.h>
-
-__BEGIN_DECLS
-
-/* Send COUNT bytes from file associated with IN_FD starting at OFFSET to
-   descriptor OUT_FD.  */
-#ifndef __USE_FILE_OFFSET64
-extern ssize_t sendfile (int __out_fd, int __in_fd, off_t *__offset,
-                        size_t __count) __THROW;
-#else
-# ifdef __REDIRECT
-extern ssize_t __REDIRECT (sendfile,
-                          (int __out_fd, int __in_fd, __off64_t *__offset,
-                           size_t __count) __THROW,
-                          sendfile64);
-# else
-#  define sendfile sendfile64
-# endif
-#endif
-#ifdef __USE_LARGEFILE64
-extern ssize_t sendfile64 (int __out_fd, int __in_fd, __off64_t *__offset,
-                          size_t __count) __THROW;
-#endif
-
-__END_DECLS
-
-#endif /* sys/sendfile.h */