mtd: improve support for reading input from a pipe. fixes sysupgrade
authorFelix Fietkau <nbd@openwrt.org>
Thu, 25 Sep 2008 18:24:18 +0000 (18:24 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 25 Sep 2008 18:24:18 +0000 (18:24 +0000)
SVN-Revision: 12706

package/mtd/src/mtd.c

index 18c3e97..6e430f4 100644 (file)
@@ -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)