You will have to incorporate the check for sendfile, but otherwise
this patch should avoid the most common kernel<->user space read/write
transitions.
m4/sendfile.m4:
===============
#serial 1
dnl From Kristofer Spinka <[EMAIL PROTECTED]>.
dnl Find out if this platform has sendfile support.
dnl
AC_CHECK_HEADER([sys/sendfile.h],
[AC_DEFINE([HAVE_SYS_SENDFILE_H])],
[AC_MSG_ERROR([No sendfile() system call support :(])])
===============
src/copy.c:
===========
--- copy.c 2003-03-24 02:33:07.000000000 -0500
+++ copy-sendfile.c 2003-03-24 02:31:24.000000000 -0500
@@ -217,6 +217,8 @@
int *ip;
int return_val = 0;
off_t n_read_total = 0;
+ off_t always_zero_offset = 0;
+ ssize_t sendfile_bytes_written;
int last_write_made_hole = 0;
int make_holes = (x->sparse_mode == SPARSE_ALWAYS);
@@ -279,6 +281,26 @@
goto close_src_desc;
}
+#ifdef HAVE_SYS_SENDFILE_H
+ /* This is the way all copies should happen, let's try to avoid being
+ a Mexican jumping bean between the kernel and user spaces.
+ We need to have a sendfile() system call to make this possible.
+ Kristofer Spinka <[EMAIL PROTECTED]> */
+
+ sendfile_bytes_written = sendfile (dest_desc, source_desc,
&always_zero_offset, src_open_sb.st_size);
+
+ if (sendfile_bytes_written == -1)
+ {
+ error (0, errno, _("sendfile zero-copy failed."));
+ return_val = -1;
+ goto close_src_and_dst_desc;
+ }
+ else
+ {
+ goto close_src_and_dst_desc;
+ }
+#endif
+
/* Determine the optimal buffer size. */
if (fstat (dest_desc, &sb))
===========
/kristofer
_______________________________________________
Bug-fileutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-fileutils