Diff for /embedtools/src/imgupd.c between versions 1.1.2.1 and 1.1.2.3

version 1.1.2.1, 2014/02/05 12:37:31 version 1.1.2.3, 2014/02/05 13:57:01
Line 14  Usage() Line 14  Usage()
                 "=== %s === %s@%s ===\n\n"                  "=== %s === %s@%s ===\n\n"
                 "  Syntax: imgupd [options] <image_file>\n\n"                  "  Syntax: imgupd [options] <image_file>\n\n"
                 "\t-v\t\tVerbose ...\n"                  "\t-v\t\tVerbose ...\n"
                "\t-s <size>\tStorage size\n"                "\t-t\t\tTruncate Storage file name\n"
                 "\t-s <size>\tStorage image file to size\n"
                 "\t-f <devfile>\tStorage file name\n"                  "\t-f <devfile>\tStorage file name\n"
                 "\n", compiled, compiledby, compilehost);                  "\n", compiled, compiledby, compilehost);
 }  }
Line 26  EmptyStore(int img) Line 27  EmptyStore(int img)
         u_char buf[IMGBLOCK_SIZE];          u_char buf[IMGBLOCK_SIZE];
         ssize_t wlen;          ssize_t wlen;
   
           VERB(1) printf("Erase store %s\n", imgName);
   
           iSize = lseek(img, 0, SEEK_END);
           if (iSize == -1) {
                   ESYSERR(0);
                   return -1;
           } else
                   imgSize += E_ALIGN(iSize, IMGBLOCK_SIZE);
   
         memset(buf, 0, sizeof buf);          memset(buf, 0, sizeof buf);
        for (i = 0; i < howmany(imgSize, IMGBLOCK_SIZE); i++)        for (i = howmany(iSize, IMGBLOCK_SIZE); i < howmany(imgSize, IMGBLOCK_SIZE); i++)
                 if ((wlen = write(img, buf, sizeof buf)) == -1 ||                   if ((wlen = write(img, buf, sizeof buf)) == -1 || 
                                 wlen != sizeof buf) {                                  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);                                          i, wlen, sizeof buf);
                         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, 0, SEEK_END);        iSize = lseek(img, iSize, SEEK_SET);
         return iSize;          return iSize;
 }  }
   
   static int
   FillStore(int img, int fd)
   {
           register int i, j;
           u_char buf[IMGBLOCK_SIZE];
           ssize_t rlen, wlen;
   
           VERB(1) printf("Fill store %s from image file %s\n", imgName, imgFile);
   
           iSize = lseek(img, 0, SEEK_CUR);
           printf("n_%lld\n", iSize);
           for (j = 0, i = howmany(iSize, IMGBLOCK_SIZE); i < howmany(imgSize, IMGBLOCK_SIZE); 
                           i++, j++) {
                   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, j);
   
                   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  int
 main(int argc, char **argv)  main(int argc, char **argv)
 {  {
         char ch;          char ch;
        int fd, img;        int fd, img, tr = 0;
   
        while ((ch = getopt(argc, argv, "hvs:f:")) != -1)        while ((ch = getopt(argc, argv, "hvts:f:")) != -1)
                 switch (ch) {                  switch (ch) {
                         case 'f':                          case 'f':
                                 strlcpy(imgName, optarg, sizeof imgName);                                  strlcpy(imgName, optarg, sizeof imgName);
Line 58  main(int argc, char **argv) Line 105  main(int argc, char **argv)
                                         return 1;                                          return 1;
                                 }                                  }
                                 break;                                  break;
                           case 't':
                                   tr = O_TRUNC;
                                   break;
                         case 'v':                          case 'v':
                                 Verbose++;                                  Verbose++;
                                 break;                                  break;
Line 85  main(int argc, char **argv) Line 135  main(int argc, char **argv)
                 fSize = lseek(fd, 0, SEEK_END);                  fSize = lseek(fd, 0, SEEK_END);
         if (fSize == -1 || fSize > imgSize) {          if (fSize == -1 || fSize > imgSize) {
                 close(fd);                  close(fd);
                printf("Error:: file size %llu is greater from storage size %llu\n",                 EERROR(ENOSPC, "Error:: file size %llu is greater from storage size %llu\n", 
                                 fSize, imgSize);                                  fSize, imgSize);
                 return 2;                  return 2;
         } else          } else
                 lseek(fd, 0, SEEK_SET);                  lseek(fd, 0, SEEK_SET);
   
         /* open storage device */          /* open storage device */
        img = open(imgName, O_RDWR | O_CREAT, 0644);        img = open(imgName, O_RDWR | O_CREAT | tr, 0644);
         if (img == -1) {          if (img == -1) {
                 ESYSERR(0);                  ESYSERR(0);
                 close(fd);                  close(fd);
                 return 3;                  return 3;
         }          }
        if (EmptyStore(img) == -1 || iSize < imgSize) {        if (EmptyStore(img) == -1) {
                 close(fd);                  close(fd);
                 close(img);                  close(img);
                 unlink(imgName);                  unlink(imgName);
                 printf("Error:: current storage size %llu is smaller from storage size %llu\n",   
                                 iSize, imgSize);  
                 return 3;                  return 3;
        } else        }
                lseek(img, 0, SEEK_SET);
         if (FillStore(img, fd) == -1) {
                 close(fd);
                 close(img);
                 unlink(imgName);
                 return 4;
         }
   
         close(img);          close(img);
         close(fd);          close(fd);

Removed from v.1.1.2.1  
changed lines
  Added in v.1.1.2.3


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