summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2010-06-28 10:35:58 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2010-06-28 10:35:58 +0200
commit40aad62d1c2d0b49ab16d6891bbcbb3b39a56df9 (patch)
treef4b4ff7345379b62e29ff59b05c313a1ecaadbf6 /commands
parent1a6fc8feb61c7fb27d206851baf60e3e60c2c90a (diff)
parent112d65d3d2bde37529e61d6ad3011c39a1f65589 (diff)
downloadbarebox-40aad62d1c2d0b49ab16d6891bbcbb3b39a56df9.tar.gz
barebox-40aad62d1c2d0b49ab16d6891bbcbb3b39a56df9.tar.xz
Merge remote branch 'origin/assorted-pu' into next
Diffstat (limited to 'commands')
-rw-r--r--commands/mem.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/commands/mem.c b/commands/mem.c
index 6192466522..bd1d3493c0 100644
--- a/commands/mem.c
+++ b/commands/mem.c
@@ -455,27 +455,35 @@ static int do_mem_cp(struct command *cmdtp, int argc, char *argv[])
}
while (count > 0) {
- int now, r, w;
+ int now, r, w, tmp;
now = min(RW_BUF_SIZE, count);
- if ((r = read(sourcefd, rw_buf, now)) < 0) {
+ r = read(sourcefd, rw_buf, now);
+ if (r < 0) {
perror("read");
goto out;
}
- if ((w = write(destfd, rw_buf, r)) < 0) {
- perror("write");
- goto out;
- }
-
- if (r < now)
+ if (!r)
break;
- if (w < r)
- break;
+ tmp = 0;
+ now = r;
+ while (now) {
+ w = write(destfd, rw_buf + tmp, now);
+ if (w < 0) {
+ perror("write");
+ goto out;
+ }
+ if (!w)
+ break;
- count -= now;
+ now -= w;
+ tmp += w;
+ }
+
+ count -= r;
}
if (count) {