diff options
author | Felix Fietkau <nbd@openwrt.org> | 2008-09-25 18:24:18 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2008-09-25 18:24:18 +0000 |
commit | 4a62d68975c7e681444375d453b52aa3914fa19d (patch) | |
tree | ed790a8e7eff216454b3c1bb4947840099d16767 /package/mtd | |
parent | 994db6ede46ec123023c7e00ea29a033a7cd5166 (diff) | |
download | upstream-4a62d68975c7e681444375d453b52aa3914fa19d.tar.gz upstream-4a62d68975c7e681444375d453b52aa3914fa19d.tar.bz2 upstream-4a62d68975c7e681444375d453b52aa3914fa19d.zip |
mtd: improve support for reading input from a pipe. fixes sysupgrade
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12706 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mtd')
-rw-r--r-- | package/mtd/src/mtd.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c index 18c3e97094..6e430f4b5f 100644 --- a/package/mtd/src/mtd.c +++ b/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) |