diff -urN coreutils-6.3/src/copy.c coreutils-6.3-splice/src/copy.c --- coreutils-6.3/src/copy.c 2006-09-24 21:01:10.000000000 +0400 +++ coreutils-6.3-splice/src/copy.c 2006-10-10 12:48:20.000000000 +0400 @@ -22,6 +22,18 @@ #include #include +#include +#include + +#define __NR_pf_splice 313 +_syscall6 (long , pf_splice, + int , fd_in, + loff_t* , off_in, + int , fd_out, + loff_t* , off_out, + size_t , len, + unsigned int, flags); + #if HAVE_HURD_H # include #endif @@ -390,6 +402,70 @@ buf_alloc = xmalloc (buf_size + buf_alignment_slop); buf = ptr_align (buf_alloc, buf_alignment); + if (!make_holes) + { + int r; + unsigned long towrite, + written, + total_left; + int p [2]; + loff_t off_in = 0, + off_out = 0; + + if (pipe (p)) + { + error (0, errno, _("creating pipe")); + return_val = false; + goto close_src_and_dst_desc; + } + + while (total_left > 0) + { + r = pf_splice (source_desc, NULL/*&off_in*/, + p [1], NULL, + 4096 << 4, 0); + if (r == 0) + break; + if (r < 0) + { + error (0, errno, _("reading %s"), quote (src_name)); + return_val = false; + close (p [0]); + close (p [1]); + goto close_src_and_dst_desc; + } + + towrite = r; + written = 0; + while (written < towrite) + { + r = pf_splice (p [0], NULL, + dest_desc, NULL/*&off_out*/, + towrite - written, 0); + if (r == 0) + { + fprintf (stderr, "write returned 0\n"); + break; + } + if (r < 0) + { + error (0, errno, _("writing %s"), quote (dst_name)); + return_val = false; + close (p [0]); + close (p [1]); + goto close_src_and_dst_desc; + } + + written += r; + } + + /* FIXME check place */ + n_read_total += towrite; + } + + close (p [0]); + close (p [1]); + } else for (;;) { word *wp = NULL;