[package] unvram: make it work on bcm47xx, also look for /dev/mtdblockX
[openwrt.git] / package / mtd / src / mtd.c
index 18c3e97..a19f718 100644 (file)
@@ -18,7 +18,6 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  *
- * $Id$
  *
  * The code is based on the linux-mtd examples.
  */
@@ -138,9 +137,11 @@ int mtd_write_buffer(int fd, const char *buf, int offset, int length)
 static int
 image_check(int imagefd, const char *mtd)
 {
+       int ret = 1;
 #ifdef target_brcm
-       return trx_check(imagefd, mtd, buf, &buflen);
+       ret = trx_check(imagefd, mtd, buf, &buflen);
 #endif
+       return ret;
 }
 
 static int mtd_check(const char *mtd)
@@ -246,7 +247,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 +264,25 @@ 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)
+                               break;
 
-               buflen += r;
+                       buflen += r;
+               } while (buflen < erasesize);
+
+               if (buflen == 0)
+                       break;
 
                if (jffs2file) {
                        if (memcmp(buf, JFFS2_EOF, sizeof(JFFS2_EOF)) == 0) {
@@ -309,10 +324,6 @@ mtd_write(int imagefd, const char *mtd)
                }
                w += buflen;
 
-               /* not enough data - eof */
-               if (buflen < erasesize)
-                       break;
-
                buflen = 0;
        }
        if (!quiet)
This page took 0.025545 seconds and 4 git commands to generate.