aboutsummaryrefslogtreecommitdiff
path: root/libbb/copyfd.c
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-11-25 23:50:28 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2006-11-25 23:50:28 +0000
commita0f78c266b49e283f862a642ede1cc1ed439162a (patch)
tree9e5d35d70aa35b0a06248c5d1189e8eb274083b0 /libbb/copyfd.c
parent4250ba3f536c66fa7caeb4e2a7110e69f69925de (diff)
downloadbusybox-w32-a0f78c266b49e283f862a642ede1cc1ed439162a.tar.gz
busybox-w32-a0f78c266b49e283f862a642ede1cc1ed439162a.tar.bz2
busybox-w32-a0f78c266b49e283f862a642ede1cc1ed439162a.zip
tee: fix bug: argv[-1] is a no-no!
bb_full_fd_action: optimize die_if_ferror: "<applet>: filename" isn't a good err msg, add "..I/O error" git-svn-id: svn://busybox.net/trunk/busybox@16669 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'libbb/copyfd.c')
-rw-r--r--libbb/copyfd.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/libbb/copyfd.c b/libbb/copyfd.c
index 601c51ce4..c6b886647 100644
--- a/libbb/copyfd.c
+++ b/libbb/copyfd.c
@@ -25,37 +25,50 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
25{ 25{
26 int status = -1; 26 int status = -1;
27 off_t total = 0; 27 off_t total = 0;
28 RESERVE_CONFIG_BUFFER(buffer,BUFSIZ); 28 RESERVE_CONFIG_BUFFER(buffer, BUFSIZ);
29 29
30 if (src_fd < 0) goto out; 30 if (src_fd < 0) goto out;
31 while (!size || total < size) {
32 ssize_t wr, rd;
33 31
34 rd = safe_read(src_fd, buffer, 32 if (!size) {
35 (!size || size - total > BUFSIZ) ? BUFSIZ : size - total); 33 size = BUFSIZ;
34 status = 1; /* copy until eof */
35 }
36
37 while (1) {
38 ssize_t rd;
36 39
37 if (rd > 0) { 40 rd = safe_read(src_fd, buffer, size > BUFSIZ ? BUFSIZ : size);
38 /* A -1 dst_fd means we need to fake it... */ 41
39 wr = (dst_fd < 0) ? rd : full_write(dst_fd, buffer, rd); 42 if (!rd) { /* eof - all done. */
43 status = 0;
44 break;
45 }
46 if (rd < 0) {
47 bb_perror_msg(bb_msg_read_error);
48 break;
49 }
50 /* dst_fd == -1 is a fake, else... */
51 if (dst_fd >= 0) {
52 ssize_t wr = full_write(dst_fd, buffer, rd);
40 if (wr < rd) { 53 if (wr < rd) {
41 bb_perror_msg(bb_msg_write_error); 54 bb_perror_msg(bb_msg_write_error);
42 break; 55 break;
43 } 56 }
44 total += wr; 57 }
45 if (total == size) status = 0; 58 total += rd;
46 } else if (rd < 0) { 59 if (status < 0) {
47 bb_perror_msg(bb_msg_read_error); 60 size -= rd;
48 break; 61 if (!size) {
49 } else { /* eof - all done. */ 62 status = 0;
50 status = 0; 63 break;
51 break; 64 }
52 } 65 }
53 } 66 }
54 67
55out: 68out:
56 RELEASE_CONFIG_BUFFER(buffer); 69 RELEASE_CONFIG_BUFFER(buffer);
57 70
58 return status ? status : total; 71 return status ? -1 : total;
59} 72}
60 73
61 74