Merge copyfd and copy_file_chunk
[oweals/busybox.git] / libbb / copyfd.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21
22 #include <unistd.h>
23 #include <string.h>
24 #include <errno.h>
25 #include "libbb.h"
26
27 /* If chunksize is 0 copy untill EOF */
28 extern int copyfd(int fd1, int fd2, const off_t chunksize)
29 {
30         size_t nread;
31         size_t nwritten;
32         size_t size;
33         size_t remaining;
34         char buffer[BUFSIZ];
35
36         if (chunksize) {
37                 remaining = chunksize;
38         } else {
39                 remaining = -1;
40         }
41
42         do {
43                 if ((chunksize > BUFSIZ) || (chunksize == 0)) {
44                         size = BUFSIZ;
45                 } else {
46                         size = chunksize;
47                 }
48
49                 nread = safe_read(fd1, buffer, size);
50
51                 if (nread == -1) {
52                         perror_msg("read failure");
53                         return(-1);
54                 }
55                 else if (nread == 0) {
56                         if (chunksize) {
57                                 error_msg("Unable to read all data");
58                                 return(-1);
59                         } else {
60                                 return(0);
61                         }
62                 }
63
64                 nwritten = full_write(fd2, buffer, nread);
65
66                 if (nwritten != nread) {
67                         error_msg("Unable to write all data");
68                         return(-1);
69                 }
70
71                 if (chunksize) {
72                         remaining -= nwritten;
73                 }
74         } while (remaining != 0);
75
76         return 0;
77 }
78
79 /* END CODE */
80 /*
81 Local Variables:
82 c-file-style: "linux"
83 c-basic-offset: 4
84 tab-width: 4
85 End:
86 */