[PATCH 04/11] memcpy cmd: Do not expect to read/write the whole chunk at once

Sascha Hauer s.hauer at pengutronix.de
Thu Jun 24 05:39:09 EDT 2010


read() does not necessarily return the number of bytes
we want to read, so deal with less bytes.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/mem.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/commands/mem.c b/commands/mem.c
index 6192466..bd1d349 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) {
-- 
1.7.1




More information about the barebox mailing list