--- embedtools/src/imgupd.c 2014/02/05 22:00:29 1.3 +++ embedtools/src/imgupd.c 2014/02/05 22:53:12 1.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: imgupd.c,v 1.3 2014/02/05 22:00:29 misho Exp $ + * $Id: imgupd.c,v 1.4 2014/02/05 22:53:12 misho Exp $ * ************************************************************************* The ELWIX and AITNET software is distributed under the following @@ -48,7 +48,7 @@ SUCH DAMAGE. char imgName[PATH_MAX], imgFile[PATH_MAX]; off_t imgSize, iSize; -int Verbose; +int Verbose, bufSize = IMGBUF_SIZE; extern char compiled[], compiledby[], compilehost[]; static void @@ -59,6 +59,8 @@ Usage() "=== %s === %s@%s ===\n\n" " Syntax: imgupd [options] [image_file]\n\n" "\t-v\t\tVerbose ...\n" + "\t-R\t\tReboot system after complete\n" + "\t-p\t\tPipe suitable transfer on little chunks\n" "\t-g\t\tGet image from Storage\n" "\t-t\t\tTruncate Storage file name\n" "\t-s \tStorage size (required for stdin)\n" @@ -70,7 +72,7 @@ static int EmptyStore(int img) { register int i; - u_char buf[IMGBUF_SIZE]; + u_char buf[bufSize]; ssize_t wlen; VERB(1) printf("Erase store %s\n", imgName); @@ -80,10 +82,10 @@ EmptyStore(int img) ESYSERR(0); return -1; } else - imgSize += E_ALIGN(iSize, IMGBUF_SIZE); + imgSize += E_ALIGN(iSize, bufSize); memset(buf, 0, sizeof buf); - for (i = howmany(iSize, IMGBUF_SIZE); i < howmany(imgSize, IMGBUF_SIZE); i++) + for (i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize); i++) if ((wlen = write(img, buf, sizeof buf)) == -1 || wlen != sizeof buf) { EERROR(EIO, "Error at chunk %d init %d bytes, should be %u\n", @@ -100,12 +102,12 @@ static int FillStore(int img, int fd) { register int i, j; - u_char buf[IMGBUF_SIZE]; + u_char buf[bufSize]; ssize_t rlen, wlen; VERB(1) printf("Fill store %s from image file %s\n", imgName, imgFile); - for (j = 0, i = howmany(iSize, IMGBUF_SIZE); i < howmany(imgSize, IMGBUF_SIZE); + for (j = 0, i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize); i++, j++) { memset(buf, 0, sizeof buf); rlen = read(fd, buf, sizeof buf); @@ -134,10 +136,10 @@ FillStore(int img, int fd) int main(int argc, char **argv) { - char ch, m = 0; + char ch, m = 0, R = 0; int fd, img, tr = 0; - while ((ch = getopt(argc, argv, "hvgts:f:")) != -1) + while ((ch = getopt(argc, argv, "hvRpgts:f:")) != -1) switch (ch) { case 'f': strlcpy(imgName, optarg, sizeof imgName); @@ -155,6 +157,12 @@ main(int argc, char **argv) case 'g': m = 1; break; + case 'p': + bufSize = IMGBUF_SIZE2; + break; + case 'R': + R = 1; + break; case 'v': Verbose++; break; @@ -177,7 +185,7 @@ main(int argc, char **argv) } else iSize = lseek(fd, 0, SEEK_END); if (!imgSize) - imgSize = E_ALIGN(iSize, IMGBUF_SIZE); + imgSize = E_ALIGN(iSize, bufSize); if (iSize == -1 || iSize > imgSize) { close(fd); EERROR(ENOSPC, "Error:: file size %llu is " @@ -230,7 +238,7 @@ main(int argc, char **argv) } else iSize = lseek(img, 0, SEEK_END); if (!imgSize) - imgSize = E_ALIGN(iSize, IMGBUF_SIZE); + imgSize = E_ALIGN(iSize, bufSize); if (iSize == -1 || iSize > imgSize) { if (fd > 2) close(fd); @@ -274,5 +282,8 @@ main(int argc, char **argv) close(img); if (fd > 2) close(fd); + + if (R) + reboot(RB_AUTOBOOT); return 0; }