Patch from Konstantin Isakov <ikm@pisem.net>:
[oweals/busybox.git] / archival / libunarchive / copy_file_chunk_fd.c
1 #include <unistd.h>
2 #include <sys/types.h>
3 #include "libbb.h"
4
5 /* Copy CHUNKSIZE bytes (or untill EOF if chunksize == -1)
6  * from SRC_FILE to DST_FILE. */
7 extern int copy_file_chunk_fd(int src_fd, int dst_fd, off_t chunksize)
8 {
9         size_t nread, size;
10         char buffer[BUFSIZ];
11
12         while (chunksize != 0) {
13                 if (chunksize > BUFSIZ) {
14                         size = BUFSIZ;
15                 } else {
16                         size = chunksize;
17                 }
18                 nread = xread(src_fd, buffer, size);
19                 if (nread == 0) {
20                         return 1;
21                 }
22
23                 if (write (dst_fd, buffer, nread) != nread) {
24                         error_msg_and_die ("Short write");
25                 }
26
27                 if (chunksize != -1) {
28                         chunksize -= nread;
29                 }
30         }
31
32         return 0;
33 }