mtd: support -c (datasize) option for fixseama command
authorRafał Miłecki <zajec5@gmail.com>
Fri, 10 Jun 2016 23:41:10 +0000 (01:41 +0200)
committerRafał Miłecki <zajec5@gmail.com>
Mon, 20 Jun 2016 06:01:31 +0000 (08:01 +0200)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
package/system/mtd/src/mtd.c
package/system/mtd/src/mtd.h
package/system/mtd/src/seama.c

index 284c8791ddff9e1f31f16bf9a766cd947c242213..8fbddf56da5a01a980de52e7d4487b2a19dd9cf2 100644 (file)
@@ -674,7 +674,7 @@ resume:
                        break;
                case MTD_IMAGE_FORMAT_SEAMA:
                        if (mtd_fixseama)
-                               mtd_fixseama(mtd, 0);
+                               mtd_fixseama(mtd, 0, 0);
                        break;
                default:
                        break;
@@ -737,8 +737,10 @@ static void usage(void)
        if (mtd_fixtrx) {
            fprintf(stderr,
        "        -o offset               offset of the image header in the partition(for fixtrx)\n");
+       }
+       if (mtd_fixtrx || mtd_fixseama) {
                fprintf(stderr,
-       "        -c datasize             amount of data to be used for checksum calculation (for fixtrx)\n");
+       "        -c datasize             amount of data to be used for checksum calculation (for fixtrx / fixseama)\n");
        }
        fprintf(stderr,
 #ifdef FIS_SUPPORT
@@ -987,7 +989,7 @@ int main (int argc, char **argv)
                        break;
                case CMD_FIXSEAMA:
                        if (mtd_fixseama)
-                               mtd_fixseama(device, 0);
+                               mtd_fixseama(device, 0, data_size);
                        break;
        }
 
index 0a8b1ae0fd392f9d66af1581df199afdc511ee24..9b2e32ffd4f4adc53cb38d87ed744a252e64f12e 100644 (file)
@@ -26,6 +26,6 @@ extern void mtd_parse_jffs2data(const char *buf, const char *dir);
 extern int trx_fixup(int fd, const char *name)  __attribute__ ((weak));
 extern int trx_check(int imagefd, const char *mtd, char *buf, int *len) __attribute__ ((weak));
 extern int mtd_fixtrx(const char *mtd, size_t offset, size_t data_size) __attribute__ ((weak));
-extern int mtd_fixseama(const char *mtd, size_t offset) __attribute__ ((weak));
+extern int mtd_fixseama(const char *mtd, size_t offset, size_t data_size) __attribute__ ((weak));
 extern int mtd_resetbc(const char *mtd) __attribute__ ((weak));
 #endif /* __mtd_h */
index f8b677b1897c1369bc1c923e4e329bbe7d8a6c14..bcda321918d03a772ee6a420501aa899af0ca300 100644 (file)
@@ -104,14 +104,13 @@ err_out:
 }
 
 int
-mtd_fixseama(const char *mtd, size_t offset)
+mtd_fixseama(const char *mtd, size_t offset, size_t data_size)
 {
        int fd;
        char *first_block;
        ssize_t res;
        size_t block_offset;
        size_t data_offset;
-       size_t data_size;
        struct seama_entity_header *shdr;
 
        if (quiet < 2)
@@ -155,7 +154,8 @@ mtd_fixseama(const char *mtd, size_t offset)
        }
 
        data_offset = offset + sizeof(struct seama_entity_header) + ntohs(shdr->metasize);
-       data_size = mtdsize - data_offset;
+       if (!data_size)
+               data_size = mtdsize - data_offset;
        if (data_size > ntohl(shdr->size))
                data_size = ntohl(shdr->size);
        if (seama_fix_md5(shdr, fd, data_offset, data_size))