Преглед изворни кода

mtd: improve support for reading input from a pipe. fixes sysupgrade

SVN-Revision: 12706
Felix Fietkau пре 17 година
родитељ
комит
5a0a3cbc00
1 измењених фајлова са 21 додато и 9 уклоњено
  1. 21 9
      package/mtd/src/mtd.c

+ 21 - 9
package/mtd/src/mtd.c

@@ -246,7 +246,7 @@ static int
 mtd_write(int imagefd, const char *mtd)
 {
 	int fd, result;
-	size_t r, w, e;
+	ssize_t r, w, e;
 
 	fd = mtd_check_open(mtd);
 	if(fd < 0) {
@@ -263,11 +263,27 @@ mtd_write(int imagefd, const char *mtd)
 
 	for (;;) {
 		/* buffer may contain data already (from trx check) */
-		r = read(imagefd, buf + buflen, erasesize - buflen);
-		if (r < 0)
-			break;
+		do {
+			r = read(imagefd, buf + buflen, erasesize - buflen);
+			if (r < 0) {
+				if ((errno == EINTR) || (errno == EAGAIN))
+					continue;
+				else {
+					perror("read");
+					break;
+				}
+			}
+
+			if (r == 0) {
+				fprintf(stderr, "No more data left\n");
+				break;
+			}
+
+			buflen += r;
+		} while (buflen < erasesize);
 
-		buflen += r;
+		if (buflen == 0)
+			break;
 
 		if (jffs2file) {
 			if (memcmp(buf, JFFS2_EOF, sizeof(JFFS2_EOF)) == 0) {
@@ -309,10 +325,6 @@ mtd_write(int imagefd, const char *mtd)
 		}
 		w += buflen;
 
-		/* not enough data - eof */
-		if (buflen < erasesize)
-			break;
-
 		buflen = 0;
 	}
 	if (!quiet)