mtd: improve support for reading input from a pipe. fixes sysupgrade
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 25 Sep 2008 18:24:18 +0000 (18:24 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 25 Sep 2008 18:24:18 +0000 (18:24 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12706 3c298f89-4303-0410-b956-a3cf2f4a3e73

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;
 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) {
 
        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) */
 
        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) {
 
                if (jffs2file) {
                        if (memcmp(buf, JFFS2_EOF, sizeof(JFFS2_EOF)) == 0) {
@@ -309,10 +325,6 @@ mtd_write(int imagefd, const char *mtd)
                }
                w += buflen;
 
                }
                w += buflen;
 
-               /* not enough data - eof */
-               if (buflen < erasesize)
-                       break;
-
                buflen = 0;
        }
        if (!quiet)
                buflen = 0;
        }
        if (!quiet)
This page took 0.025636 seconds and 4 git commands to generate.