Diff for /embedtools/src/imgupd.c between versions 1.6.2.2 and 1.6.2.6

version 1.6.2.2, 2014/02/06 00:16:05 version 1.6.2.6, 2014/02/06 14:22:43
Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH Line 44  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
 SUCH DAMAGE.  SUCH DAMAGE.
 */  */
 #include "global.h"  #include "global.h"
   #include "imgupd.h"
   
   
 char imgName[PATH_MAX], imgFile[PATH_MAX];  char imgName[PATH_MAX], imgFile[PATH_MAX];
 off_t imgSize, iSize, fromBegin;  off_t imgSize, iSize, fromBegin;
int Verbose, bufSize = IMGBUF_SIZE;int Verbose, nameFlg, fileFlg, bufSize = IMGBUF_SIZE;
 extern char compiled[], compiledby[], compilehost[];  extern char compiled[], compiledby[], compilehost[];
   
 static void  static void
Line 70  Usage() Line 71  Usage()
 }  }
   
 static int  static int
EmptyStore(int img)getFDtype(int fd)
 {  {
           int type, flg = 0;
           struct stat sb;
   
           if (fstat(fd, &sb) == -1) {
                   ESYSERR(0);
                   return -1;
           }
           if (S_ISREG(sb.st_mode))
                   flg |= FD_TRUNC;
           if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) {
                   if (ioctl(fd, FIODTYPE, &type) == -1) {
                           ESYSERR(0);
                           return -1;
                   }
                   if (type & D_TAPE)
                           flg |= FD_TAPE;
                   else if (type & (D_DISK | D_MEM))
                           flg |= FD_SEEK;
                   if (S_ISCHR(sb.st_mode) && !(type & D_TAPE))
                           flg |= FD_CHR;
                   goto end;
           }
           errno ^= errno;
           if (lseek(fd, 0, SEEK_CUR) == -1 && errno == ESPIPE)
                   flg |= FD_PIPE;
           else
                   flg |= FD_SEEK;
   end:
           return flg;
   }
   
   static int
   EmptyStore(int img, int flg)
   {
         register int i;          register int i;
         u_char buf[bufSize];          u_char buf[bufSize];
         ssize_t wlen;          ssize_t wlen;
   
         VERB(1) printf("Erase store %s\n", imgName);          VERB(1) printf("Erase store %s\n", imgName);
   
        if (!fromBegin) {        if (!fromBegin && flg & FD_SEEK) {
                 iSize = lseek(img, 0, SEEK_END);                  iSize = lseek(img, 0, SEEK_END);
                 if (iSize == -1) {                  if (iSize == -1) {
                         ESYSERR(0);                          ESYSERR(0);
Line 92  EmptyStore(int img) Line 127  EmptyStore(int img)
         for (i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize); i++)          for (i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize); i++)
                 if ((wlen = write(img, buf, bufSize)) == -1 ||                   if ((wlen = write(img, buf, bufSize)) == -1 || 
                                 (wlen && wlen != bufSize)) {                                  (wlen && wlen != bufSize)) {
                        EERROR(EIO, "Error at chunk %d init %d bytes, "                        if (wlen == -1)
                                        "should be %u\n", i, wlen, bufSize);                                ESYSERR(0);
                         else
                                 EERROR(EIO, "Error at chunk %d init %d bytes, "
                                                 "should be %u\n", i, wlen, bufSize);
                         return -1;                          return -1;
                 } else                  } else
                         VERB(1) printf("+Written chunk #%d\n", i);                          VERB(1) printf("+Written chunk #%d\n", i);
   
        iSize = lseek(img, iSize, SEEK_SET);        if (flg & FD_SEEK)
                 iSize = lseek(img, iSize, SEEK_SET);
         return iSize;          return iSize;
 }  }
   
 static int  static int
FillStore(int img, int fd)FillStore(int img, int iflg, int fd, int fflg)
 {  {
         register int i, j;          register int i, j;
        u_char buf[bufSize];        u_char *pos, buf[bufSize];
        ssize_t rlen, wlen;        ssize_t rlen, wlen, len;
   
         VERB(1) printf("Fill store %s from image file %s\n", imgName, imgFile);          VERB(1) printf("Fill store %s from image file %s\n", imgName, imgFile);
   
         for (j = 0, i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize);           for (j = 0, i = howmany(iSize, bufSize); i < howmany(imgSize, bufSize); 
                         i++, j++) {                          i++, j++) {
                 memset(buf, 0, sizeof buf);                  memset(buf, 0, sizeof buf);
                rlen = read(fd, buf, bufSize);                for (len = bufSize, pos = buf; len > 0; len -= rlen, pos += rlen) {
                if (rlen == -1) {                        rlen = read(fd, pos, len);
                        ESYSERR(0);                        if (rlen == -1) {
                        return -1;                                ESYSERR(0);
                } else if (!rlen)                                return -1;
                        break;                        } else if (!rlen)
                else                                break;
                        VERB(1) printf("+Readed %d bytes for chunk #%d\n", rlen, j);                        else
                                 VERB(1) printf("+Readed %d bytes for chunk #%d\n", rlen, j);
                 }
   
                wlen = write(img, buf, rlen);                wlen = write(img, buf, bufSize);
                 if (wlen == -1) {                  if (wlen == -1) {
                         ESYSERR(0);                          ESYSERR(0);
                         return -1;                          return -1;
                } else if (wlen && wlen != rlen) {                } else if (wlen && wlen != bufSize) {
                        EERROR(EIO, "Readed %d bytes are not equal to written %d bytes\n",                         EERROR(EIO, "Error at chunk %d written %d bytes, "
                                        rlen, wlen);                                        "should be %u\n", i, wlen, bufSize);
                 } else                  } else
                         VERB(1) printf("+Written %d bytes at chunk #%d\n", wlen, i);                          VERB(1) printf("+Written %d bytes at chunk #%d\n", wlen, i);
         }          }
Line 189  main(int argc, char **argv) Line 230  main(int argc, char **argv)
                                 ESYSERR(0);                                  ESYSERR(0);
                                 return 2;                                  return 2;
                         } else                          } else
                                   fileFlg = getFDtype(fd);
   
                           if (fileFlg & FD_SEEK) {
                                 iSize = lseek(fd, 0, SEEK_END);                                  iSize = lseek(fd, 0, SEEK_END);
                        if (!imgSize)                                if (!imgSize)
                                imgSize = E_ALIGN(iSize, bufSize);                                        imgSize = E_ALIGN(iSize, bufSize);
                        if (iSize == -1 || iSize > imgSize) {                                if (iSize == -1 || iSize > imgSize) {
                                         close(fd);
                                         EERROR(ENOSPC, "Error:: file size %llu is "
                                                         "greater from storage size %llu\n", 
                                                         iSize, imgSize);
                                         return 2;
                                 } else
                                         lseek(fd, 0, SEEK_SET);
                         }
                 } else {
                         fd = STDIN_FILENO;
                         fileFlg = getFDtype(fd);
                 }
 
                 if (!imgSize) {
                         if (fd > 2)
                                 close(fd);                                  close(fd);
                                 EERROR(ENOSPC, "Error:: file size %llu is "  
                                                 "greater from storage size %llu\n",   
                                                 iSize, imgSize);  
                                 return 2;  
                         } else  
                                 lseek(fd, 0, SEEK_SET);  
                 } else if (!imgSize) {  
                         Usage();                          Usage();
                         return 1;                          return 1;
                } else                }
                        fd = STDIN_FILENO; 
         } else {        /* GET */          } else {        /* GET */
                 if (argc) {                  if (argc) {
                         strlcpy(imgFile, *argv, sizeof imgFile);                          strlcpy(imgFile, *argv, sizeof imgFile);
Line 213  main(int argc, char **argv) Line 264  main(int argc, char **argv)
                         if (fd == -1) {                          if (fd == -1) {
                                 ESYSERR(0);                                  ESYSERR(0);
                                 return 2;                                  return 2;
                        }                        } else
                } else if (!imgSize) {                                fileFlg = getFDtype(fd);
                        Usage();                } else {
                        return 1; 
                } else 
                         fd = STDOUT_FILENO;                          fd = STDOUT_FILENO;
                           fileFlg = getFDtype(fd);
                   }
         }          }
   
         VERB(1) printf("imgSize=%llu imgName=%s imgFile=%s\n",           VERB(1) printf("imgSize=%llu imgName=%s imgFile=%s\n", 
Line 232  main(int argc, char **argv) Line 283  main(int argc, char **argv)
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                         return 3;                          return 3;
                }                } else
                         nameFlg = getFDtype(img);
         } else {        /* GET */          } else {        /* GET */
                 /* open storage device */                  /* open storage device */
                 img = open(imgName, O_RDONLY);                  img = open(imgName, O_RDONLY);
Line 242  main(int argc, char **argv) Line 294  main(int argc, char **argv)
                                 close(fd);                                  close(fd);
                         return 3;                          return 3;
                 } else                  } else
                           nameFlg = getFDtype(img);
   
                   if (nameFlg & FD_SEEK) {
                         iSize = lseek(img, 0, SEEK_END);                          iSize = lseek(img, 0, SEEK_END);
                if (!imgSize)                        if (!imgSize)
                        imgSize = E_ALIGN(iSize, bufSize);                                imgSize = E_ALIGN(iSize, bufSize);
                if (iSize == -1 || iSize > imgSize) {                        if (iSize == -1 || iSize > imgSize) {
                                 if (fd > 2)
                                         close(fd);
                                 close(img);
                                 EERROR(ENOSPC, "Error:: storage size %llu is "
                                                 "greater from file size %llu\n", 
                                                 iSize, imgSize);
                                 return 3;
                         } else
                                 lseek(img, 0, SEEK_SET);
                 }
 
                 if (!imgSize) {
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                        close(img);                        Usage();
                        EERROR(ENOSPC, "Error:: storage size %llu is "                        return 1;
                                        "greater from file size %llu\n",                 }
                                        iSize, imgSize); 
                        return 3; 
                } else 
                        lseek(img, 0, SEEK_SET); 
         }          }
   
         if (!m) {          if (!m) {
                if (EmptyStore(img) == -1) {                if (EmptyStore(img, nameFlg) == -1) {
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                         close(img);                          close(img);
                         return 3;                          return 3;
                 }                  }
                if (FillStore(img, fd) == -1) {                if (FillStore(img, nameFlg, fd, fileFlg) == -1) {
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                         close(img);                          close(img);
                         return 4;                          return 4;
                 }                  }
         } else {        /* GET */          } else {        /* GET */
                if (EmptyStore(fd) == -1) {                iSize ^= iSize;
                 if (EmptyStore(fd, fileFlg) == -1) {
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                         close(img);                          close(img);
                         return 3;                          return 3;
                 }                  }
                if (FillStore(fd, img) == -1) {                if (FillStore(fd, fileFlg, img, nameFlg) == -1) {
                         if (fd > 2)                          if (fd > 2)
                                 close(fd);                                  close(fd);
                         close(img);                          close(img);

Removed from v.1.6.2.2  
changed lines
  Added in v.1.6.2.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>