--- embedtools/src/imgupd.c 2014/02/05 12:37:31 1.1.2.1 +++ embedtools/src/imgupd.c 2014/02/05 12:59:55 1.1.2.2 @@ -26,11 +26,13 @@ EmptyStore(int img) u_char buf[IMGBLOCK_SIZE]; ssize_t wlen; + VERB(1) printf("Erase store %s\n", imgName); + memset(buf, 0, sizeof buf); for (i = 0; i < howmany(imgSize, IMGBLOCK_SIZE); i++) if ((wlen = write(img, buf, sizeof buf)) == -1 || wlen != sizeof buf) { - printf("Error:: at chunk %d init %d bytes, should be %u", + EERROR(EIO, "Error at chunk %d init %d bytes, should be %u\n", i, wlen, sizeof buf); return -1; } else @@ -40,6 +42,40 @@ EmptyStore(int img) return iSize; } +static int +FillStore(int img, int fd) +{ + register int i; + u_char buf[IMGBLOCK_SIZE]; + ssize_t rlen, wlen; + + VERB(1) printf("Fill store %s from image file %s\n", imgName, imgFile); + + for (i = 0; i < howmany(imgSize, IMGBLOCK_SIZE); i++) { + memset(buf, 0, sizeof buf); + rlen = read(fd, buf, sizeof buf); + if (rlen == -1) { + ESYSERR(0); + return -1; + } else if (!rlen) + break; + else + VERB(1) printf("+Readed %d bytes for chunk #%d\n", rlen, i); + + wlen = write(img, buf, rlen); + if (wlen == -1) { + ESYSERR(0); + return -1; + } else if (!wlen || wlen != rlen) { + EERROR(EIO, "Readed %d bytes are not equal to written %d bytes\n", + rlen, wlen); + } else + VERB(1) printf("+Written %d bytes at chunk #%d\n", wlen, i); + } + + return 0; +} + int main(int argc, char **argv) { @@ -107,6 +143,13 @@ main(int argc, char **argv) return 3; } else lseek(img, 0, SEEK_SET); + + if (FillStore(img, fd) == -1) { + close(fd); + close(img); + unlink(imgName); + return 4; + } close(img); close(fd);