X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fcopy_file_chunk.c;h=63d2ab1737389086e1616863bd22a51c0d637509;hb=2e51a14d57c3a2e6e2189d2a4c39f09023e4c524;hp=e9663c3542e5e12bf24cfe7e7adaddff7d6df3cd;hpb=c9cac5be236475e91af1865a2dae2c2af5f19fd6;p=oweals%2Fbusybox.git diff --git a/libbb/copy_file_chunk.c b/libbb/copy_file_chunk.c index e9663c354..63d2ab173 100644 --- a/libbb/copy_file_chunk.c +++ b/libbb/copy_file_chunk.c @@ -2,65 +2,69 @@ /* * Utility routines. * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. + * Copyright (C) many different people. If you wrote this, please + * acknowledge your work. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * This program 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA */ #include #include #include "libbb.h" -/* - * Copy chunksize bytes between two file descriptors - * - * unsigned long is used so that if -1 is passed as chunksize it will read as - * much as possible, and it will work with off_t or off64_t - */ +/* Copy CHUNKSIZE bytes (or until EOF if CHUNKSIZE equals -1) from SRC_FILE + * to DST_FILE. */ extern int copy_file_chunk(FILE *src_file, FILE *dst_file, unsigned long long chunksize) { - off_t size, amount_written; - char buffer[BUFSIZ]; /* BUFSIZ is declared in stdio.h */ - - while (chunksize > 0) { - if (chunksize > BUFSIZ) { + size_t nread, nwritten, size; + char buffer[BUFSIZ]; + + while (chunksize != 0) { + if (chunksize > BUFSIZ) size = BUFSIZ; - } else { + else size = chunksize; + + nread = fread (buffer, 1, size, src_file); + + if (nread != size && ferror (src_file)) { + perror_msg ("read"); + return -1; + } else if (nread == 0) { + if (chunksize != -1) { + error_msg ("Unable to read all data"); + return -1; + } + + return 0; } - amount_written = fwrite(buffer, 1, fread(buffer, 1, size, src_file), dst_file); - if (amount_written != size) { - error_msg("Couldnt write correct amount"); - return(FALSE); + + nwritten = fwrite (buffer, 1, nread, dst_file); + + if (nwritten != nread) { + if (ferror (dst_file)) + perror_msg ("write"); + else + error_msg ("Unable to write all data"); + return -1; } - chunksize -= amount_written; + + if (chunksize != -1) + chunksize -= nwritten; } - return (TRUE); -} -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ + return 0; +}