Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 1 | #include "cache.h" |
| 2 | |
| 3 | int copy_fd(int ifd, int ofd) |
| 4 | { |
| 5 | while (1) { |
| 6 | int len; |
| 7 | char buffer[8192]; |
| 8 | char *buf = buffer; |
Junio C Hamano | 1c15afb | 2005-12-19 16:18:28 -0800 | [diff] [blame] | 9 | len = xread(ifd, buffer, sizeof(buffer)); |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 10 | if (!len) |
| 11 | break; |
| 12 | if (len < 0) { |
Junio C Hamano | e6c64fc | 2005-11-05 11:02:56 -0800 | [diff] [blame] | 13 | int read_error; |
Junio C Hamano | e6c64fc | 2005-11-05 11:02:56 -0800 | [diff] [blame] | 14 | read_error = errno; |
| 15 | close(ifd); |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 16 | return error("copy-fd: read returned %s", |
Junio C Hamano | e6c64fc | 2005-11-05 11:02:56 -0800 | [diff] [blame] | 17 | strerror(read_error)); |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 18 | } |
Junio C Hamano | 1c15afb | 2005-12-19 16:18:28 -0800 | [diff] [blame] | 19 | while (len) { |
| 20 | int written = xwrite(ofd, buf, len); |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 21 | if (written > 0) { |
| 22 | buf += written; |
| 23 | len -= written; |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 24 | } |
Sam Ravnborg | 08337a9 | 2005-12-27 09:19:05 +0100 | [diff] [blame] | 25 | else if (!written) { |
| 26 | close(ifd); |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 27 | return error("copy-fd: write returned 0"); |
Sam Ravnborg | 08337a9 | 2005-12-27 09:19:05 +0100 | [diff] [blame] | 28 | } else { |
| 29 | close(ifd); |
Junio C Hamano | 1c15afb | 2005-12-19 16:18:28 -0800 | [diff] [blame] | 30 | return error("copy-fd: write returned %s", |
| 31 | strerror(errno)); |
Sam Ravnborg | 08337a9 | 2005-12-27 09:19:05 +0100 | [diff] [blame] | 32 | } |
Junio C Hamano | f3123c4 | 2005-10-22 01:28:13 -0700 | [diff] [blame] | 33 | } |
| 34 | } |
| 35 | close(ifd); |
| 36 | return 0; |
| 37 | } |
| 38 | |