Mirror of git://git.busybox.net/busybox with our patches on top
Source
xxxxxxxxxx
/* vi: set sw=4 ts=4: */
/*
* Utility routines.
*
* Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
/*
* We were using 0x7fff0000 as sendfile chunk size, but it
* was seen to cause largish delays when user tries to ^C a file copy.
* Let's use a saner size.
* Note: needs to be >= max(CONFIG_FEATURE_COPYBUF_KB),
* or else "copy to eof" code will use neddlesly short reads.
*/
/* Used by NOFORK applets (e.g. cat) - must not use xmalloc.
* size < 0 means "ignore write errors", used by tar --to-command
* size = 0 means "copy till EOF"
*/
static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
{
int status = -1;
off_t total = 0;
bool continue_on_write_error = 0;
ssize_t sendfile_sz;
char *buffer = buffer; /* for compiler */
int buffer_size = 0;
char buffer[CONFIG_FEATURE_COPYBUF_KB * 1024];
enum { buffer_size = sizeof(buffer) };
if (size < 0) {
size = -size;
continue_on_write_error = 1;
}
if (src_fd < 0)
goto out;
sendfile_sz = !ENABLE_FEATURE_USE_SENDFILE
? 0
: SENDFILE_BIGBUF;
if (!size) {
size = SENDFILE_BIGBUF;
status = 1; /* copy until eof */
}
while (1) {
ssize_t rd;
if (sendfile_sz) {