blob: 4df1fd084af856eb19590ad5736346edf5853ce9 [file] [log] [blame]
Eric Andersen55f98722001-05-15 17:48:09 +00001/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
Eric Andersenbdfd0d72001-10-24 05:00:29 +00005 * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
Eric Andersen55f98722001-05-15 17:48:09 +00006 *
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
Glenn L McGrath25fe94f2002-12-13 08:20:44 +000027/* If chunksize is 0 copy untill EOF */
28extern int copyfd(int fd1, int fd2, const off_t chunksize)
Eric Andersen55f98722001-05-15 17:48:09 +000029{
Glenn L McGrath25fe94f2002-12-13 08:20:44 +000030 size_t nread;
31 size_t nwritten;
32 size_t size;
33 size_t remaining;
34 char buffer[BUFSIZ];
Eric Andersen55f98722001-05-15 17:48:09 +000035
Glenn L McGrath25fe94f2002-12-13 08:20:44 +000036 if (chunksize) {
37 remaining = chunksize;
38 } else {
39 remaining = -1;
Eric Andersen55f98722001-05-15 17:48:09 +000040 }
Matt Kraaid6ef0742001-05-18 14:14:55 +000041
Glenn L McGrath25fe94f2002-12-13 08:20:44 +000042 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
Matt Kraaid6ef0742001-05-18 14:14:55 +000076 return 0;
Eric Andersen55f98722001-05-15 17:48:09 +000077}
78
79/* END CODE */
80/*
81Local Variables:
82c-file-style: "linux"
83c-basic-offset: 4
84tab-width: 4
85End:
86*/