diff options
Diffstat (limited to 'jffs2dump.c')
-rw-r--r-- | jffs2dump.c | 770 |
1 files changed, 385 insertions, 385 deletions
diff --git a/jffs2dump.c b/jffs2dump.c index 0db0cd7..2842f03 100644 --- a/jffs2dump.c +++ b/jffs2dump.c @@ -55,33 +55,33 @@ char *data; // image data void display_help (void) { printf("Usage: dumpjffs2 [OPTION] INPUTFILE\n" - "Dumps the contents of a binary JFFS2 image.\n" - "\n" - " --help display this help and exit\n" - " --version output version information and exit\n" - "-b --bigendian image is big endian\n" - "-l --littleendian image is little endian\n" - "-c --content dump image contents\n" - "-e fname --endianconvert=fname convert image endianness, output to file fname\n" - "-r --recalccrc recalc name and data crc on endian conversion\n" - "-d len --datsize=len size of data chunks, when oob data in binary image (NAND only)\n" - "-o len --oobsize=len size of oob data chunk in binary image (NAND only)\n" - "-v --verbose verbose output\n"); + "Dumps the contents of a binary JFFS2 image.\n" + "\n" + " --help display this help and exit\n" + " --version output version information and exit\n" + "-b --bigendian image is big endian\n" + "-l --littleendian image is little endian\n" + "-c --content dump image contents\n" + "-e fname --endianconvert=fname convert image endianness, output to file fname\n" + "-r --recalccrc recalc name and data crc on endian conversion\n" + "-d len --datsize=len size of data chunks, when oob data in binary image (NAND only)\n" + "-o len --oobsize=len size of oob data chunk in binary image (NAND only)\n" + "-v --verbose verbose output\n"); exit(0); } void display_version (void) { printf(PROGRAM " " VERSION "\n" - "\n" - "Copyright (C) 2003 Thomas Gleixner \n" - "\n" - PROGRAM " comes with NO WARRANTY\n" - "to the extent permitted by law.\n" - "\n" - "You may redistribute copies of " PROGRAM "\n" - "under the terms of the GNU General Public Licence.\n" - "See the file `COPYING' for more information.\n"); + "\n" + "Copyright (C) 2003 Thomas Gleixner \n" + "\n" + PROGRAM " comes with NO WARRANTY\n" + "to the extent permitted by law.\n" + "\n" + "You may redistribute copies of " PROGRAM "\n" + "under the terms of the GNU General Public Licence.\n" + "See the file `COPYING' for more information.\n"); exit(0); } @@ -119,50 +119,50 @@ void process_options (int argc, char *argv[]) }; int c = getopt_long(argc, argv, short_options, - long_options, &option_index); + long_options, &option_index); if (c == EOF) { break; } switch (c) { - case 0: - switch (option_index) { case 0: - display_help(); + switch (option_index) { + case 0: + display_help(); + break; + case 1: + display_version(); + break; + } break; - case 1: - display_version(); + case 'v': + verbose = 1; + break; + case 'b': + target_endian = __BIG_ENDIAN; + break; + case 'l': + target_endian = __LITTLE_ENDIAN; + break; + case 'c': + dumpcontent = 1; + break; + case 'd': + datsize = atoi(optarg); + break; + case 'o': + oobsize = atoi(optarg); + break; + case 'e': + convertendian = 1; + strcpy (cnvfile, optarg); + break; + case 'r': + recalccrc = 1; + break; + case '?': + error = 1; break; - } - break; - case 'v': - verbose = 1; - break; - case 'b': - target_endian = __BIG_ENDIAN; - break; - case 'l': - target_endian = __LITTLE_ENDIAN; - break; - case 'c': - dumpcontent = 1; - break; - case 'd': - datsize = atoi(optarg); - break; - case 'o': - oobsize = atoi(optarg); - break; - case 'e': - convertendian = 1; - strcpy (cnvfile, optarg); - break; - case 'r': - recalccrc = 1; - break; - case '?': - error = 1; - break; } } @@ -206,7 +206,7 @@ void do_dumpcontent (void) if (je16_to_cpu (node->u.magic) != JFFS2_MAGIC_BITMASK) { if (!bitchbitmask++) - printf ("Wrong bitmask at 0x%08x, 0x%04x\n", p - data, je16_to_cpu (node->u.magic)); + printf ("Wrong bitmask at 0x%08x, 0x%04x\n", p - data, je16_to_cpu (node->u.magic)); p += 4; dirty += 4; continue; @@ -232,184 +232,184 @@ void do_dumpcontent (void) switch(je16_to_cpu(node->u.nodetype)) { - case JFFS2_NODETYPE_INODE: - printf ("%8s Inode node at 0x%08x, totlen 0x%08x, #ino %5d, version %5d, isize %8d, csize %8d, dsize %8d, offset %8d\n", - obsolete ? "Obsolete" : "", - p - data, je32_to_cpu (node->i.totlen), je32_to_cpu (node->i.ino), - je32_to_cpu ( node->i.version), je32_to_cpu (node->i.isize), - je32_to_cpu (node->i.csize), je32_to_cpu (node->i.dsize), je32_to_cpu (node->i.offset)); + case JFFS2_NODETYPE_INODE: + printf ("%8s Inode node at 0x%08x, totlen 0x%08x, #ino %5d, version %5d, isize %8d, csize %8d, dsize %8d, offset %8d\n", + obsolete ? "Obsolete" : "", + p - data, je32_to_cpu (node->i.totlen), je32_to_cpu (node->i.ino), + je32_to_cpu ( node->i.version), je32_to_cpu (node->i.isize), + je32_to_cpu (node->i.csize), je32_to_cpu (node->i.dsize), je32_to_cpu (node->i.offset)); + + crc = crc32 (0, node, sizeof (struct jffs2_raw_inode) - 8); + if (crc != je32_to_cpu (node->i.node_crc)) { + printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->i.node_crc), crc); + p += PAD(je32_to_cpu (node->i.totlen)); + dirty += PAD(je32_to_cpu (node->i.totlen));; + continue; + } - crc = crc32 (0, node, sizeof (struct jffs2_raw_inode) - 8); - if (crc != je32_to_cpu (node->i.node_crc)) { - printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->i.node_crc), crc); - p += PAD(je32_to_cpu (node->i.totlen)); - dirty += PAD(je32_to_cpu (node->i.totlen));; - continue; - } + crc = crc32(0, p + sizeof (struct jffs2_raw_inode), je32_to_cpu(node->i.csize)); + if (crc != je32_to_cpu(node->i.data_crc)) { + printf ("Wrong data_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->i.data_crc), crc); + p += PAD(je32_to_cpu (node->i.totlen)); + dirty += PAD(je32_to_cpu (node->i.totlen));; + continue; + } - crc = crc32(0, p + sizeof (struct jffs2_raw_inode), je32_to_cpu(node->i.csize)); - if (crc != je32_to_cpu(node->i.data_crc)) { - printf ("Wrong data_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->i.data_crc), crc); p += PAD(je32_to_cpu (node->i.totlen)); - dirty += PAD(je32_to_cpu (node->i.totlen));; - continue; - } - - p += PAD(je32_to_cpu (node->i.totlen)); - break; - - case JFFS2_NODETYPE_DIRENT: - memcpy (name, node->d.name, node->d.nsize); - name [node->d.nsize] = 0x0; - printf ("%8s Dirent node at 0x%08x, totlen 0x%08x, #pino %5d, version %5d, #ino %8d, nsize %8d, name %s\n", - obsolete ? "Obsolete" : "", - p - data, je32_to_cpu (node->d.totlen), je32_to_cpu (node->d.pino), - je32_to_cpu ( node->d.version), je32_to_cpu (node->d.ino), - node->d.nsize, name); - - crc = crc32 (0, node, sizeof (struct jffs2_raw_dirent) - 8); - if (crc != je32_to_cpu (node->d.node_crc)) { - printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->d.node_crc), crc); - p += PAD(je32_to_cpu (node->d.totlen)); - dirty += PAD(je32_to_cpu (node->d.totlen));; - continue; - } - - crc = crc32(0, p + sizeof (struct jffs2_raw_dirent), node->d.nsize); - if (crc != je32_to_cpu(node->d.name_crc)) { - printf ("Wrong name_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->d.name_crc), crc); - p += PAD(je32_to_cpu (node->d.totlen)); - dirty += PAD(je32_to_cpu (node->d.totlen));; - continue; - } - - p += PAD(je32_to_cpu (node->d.totlen)); - break; + break; - case JFFS2_NODETYPE_SUMMARY: { - - int i; - struct jffs2_sum_marker * sm; - - printf("%8s Inode Sum node at 0x%08x, totlen 0x%08x, sum_num %5d, cleanmarker size %5d\n", - obsolete ? "Obsolete" : "", - p - data, - je32_to_cpu (node->s.totlen), - je32_to_cpu (node->s.sum_num), - je32_to_cpu (node->s.cln_mkr)); - - crc = crc32 (0, node, sizeof (struct jffs2_raw_summary) - 8); - if (crc != je32_to_cpu (node->s.node_crc)) { - printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->s.node_crc), crc); - p += PAD(je32_to_cpu (node->s.totlen)); - dirty += PAD(je32_to_cpu (node->s.totlen));; - continue; - } - - crc = crc32(0, p + sizeof (struct jffs2_raw_summary), je32_to_cpu (node->s.totlen) - sizeof(struct jffs2_raw_summary)); - if (crc != je32_to_cpu(node->s.sum_crc)) { - printf ("Wrong data_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->s.sum_crc), crc); - p += PAD(je32_to_cpu (node->s.totlen)); - dirty += PAD(je32_to_cpu (node->s.totlen));; - continue; - } - - if (verbose) { - void *sp; - sp = (p + sizeof(struct jffs2_raw_summary)); - - for(i=0; i<je32_to_cpu(node->s.sum_num); i++) { - - switch(je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype)) { - case JFFS2_NODETYPE_INODE : { - - struct jffs2_sum_inode_flash *spi; - spi = sp; - - printf ("%14s #ino %5d, version %5d, offset 0x%08x, totlen 0x%08x\n", - "", - je32_to_cpu (spi->inode), - je32_to_cpu (spi->version), - je32_to_cpu (spi->offset), - je32_to_cpu (spi->totlen)); - - sp += JFFS2_SUMMARY_INODE_SIZE; - break; - } - - case JFFS2_NODETYPE_DIRENT : { - - char name[255]; - struct jffs2_sum_dirent_flash *spd; - spd = sp; - - memcpy(name,spd->name,spd->nsize); - name [spd->nsize] = 0x0; - - printf ("%14s dirent offset 0x%08x, totlen 0x%08x, #pino %5d, version %5d, #ino %8d, nsize %8d, name %s \n", - "", - je32_to_cpu (spd->offset), - je32_to_cpu (spd->totlen), - je32_to_cpu (spd->pino), - je32_to_cpu (spd->version), - je32_to_cpu (spd->ino), - spd->nsize, - name); - - sp += JFFS2_SUMMARY_DIRENT_SIZE(spd->nsize); - break; - } - - default : - printf("Unknown summary node!\n"); - break; - } + case JFFS2_NODETYPE_DIRENT: + memcpy (name, node->d.name, node->d.nsize); + name [node->d.nsize] = 0x0; + printf ("%8s Dirent node at 0x%08x, totlen 0x%08x, #pino %5d, version %5d, #ino %8d, nsize %8d, name %s\n", + obsolete ? "Obsolete" : "", + p - data, je32_to_cpu (node->d.totlen), je32_to_cpu (node->d.pino), + je32_to_cpu ( node->d.version), je32_to_cpu (node->d.ino), + node->d.nsize, name); + + crc = crc32 (0, node, sizeof (struct jffs2_raw_dirent) - 8); + if (crc != je32_to_cpu (node->d.node_crc)) { + printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->d.node_crc), crc); + p += PAD(je32_to_cpu (node->d.totlen)); + dirty += PAD(je32_to_cpu (node->d.totlen));; + continue; } - sm = (struct jffs2_sum_marker *) ((char *)p + je32_to_cpu(node->s.totlen) - sizeof(struct jffs2_sum_marker)); - - printf("%14s Sum Node Offset 0x%08x, Magic 0x%08x, Padded size 0x%08x\n", - "", - je32_to_cpu(sm->offset), - je32_to_cpu(sm->magic), - je32_to_cpu(node->s.padded)); - } - - p += PAD(je32_to_cpu (node->s.totlen)); - break; - } - - case JFFS2_NODETYPE_CLEANMARKER: - if (verbose) { - printf ("%8s Cleanmarker at 0x%08x, totlen 0x%08x\n", - obsolete ? "Obsolete" : "", - p - data, je32_to_cpu (node->u.totlen)); - } - p += PAD(je32_to_cpu (node->u.totlen)); - break; - - case JFFS2_NODETYPE_PADDING: - if (verbose) { - printf ("%8s Padding node at 0x%08x, totlen 0x%08x\n", - obsolete ? "Obsolete" : "", - p - data, je32_to_cpu (node->u.totlen)); - } - p += PAD(je32_to_cpu (node->u.totlen)); - break; + crc = crc32(0, p + sizeof (struct jffs2_raw_dirent), node->d.nsize); + if (crc != je32_to_cpu(node->d.name_crc)) { + printf ("Wrong name_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->d.name_crc), crc); + p += PAD(je32_to_cpu (node->d.totlen)); + dirty += PAD(je32_to_cpu (node->d.totlen));; + continue; + } - case 0xffff: - p += 4; - empty += 4; - break; + p += PAD(je32_to_cpu (node->d.totlen)); + break; - default: - if (verbose) { - printf ("%8s Unknown node at 0x%08x, totlen 0x%08x\n", - obsolete ? "Obsolete" : "", - p - data, je32_to_cpu (node->u.totlen)); - } - p += PAD(je32_to_cpu (node->u.totlen)); - dirty += PAD(je32_to_cpu (node->u.totlen)); + case JFFS2_NODETYPE_SUMMARY: { + + int i; + struct jffs2_sum_marker * sm; + + printf("%8s Inode Sum node at 0x%08x, totlen 0x%08x, sum_num %5d, cleanmarker size %5d\n", + obsolete ? "Obsolete" : "", + p - data, + je32_to_cpu (node->s.totlen), + je32_to_cpu (node->s.sum_num), + je32_to_cpu (node->s.cln_mkr)); + + crc = crc32 (0, node, sizeof (struct jffs2_raw_summary) - 8); + if (crc != je32_to_cpu (node->s.node_crc)) { + printf ("Wrong node_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->s.node_crc), crc); + p += PAD(je32_to_cpu (node->s.totlen)); + dirty += PAD(je32_to_cpu (node->s.totlen));; + continue; + } + + crc = crc32(0, p + sizeof (struct jffs2_raw_summary), je32_to_cpu (node->s.totlen) - sizeof(struct jffs2_raw_summary)); + if (crc != je32_to_cpu(node->s.sum_crc)) { + printf ("Wrong data_crc at 0x%08x, 0x%08x instead of 0x%08x\n", p - data, je32_to_cpu (node->s.sum_crc), crc); + p += PAD(je32_to_cpu (node->s.totlen)); + dirty += PAD(je32_to_cpu (node->s.totlen));; + continue; + } + + if (verbose) { + void *sp; + sp = (p + sizeof(struct jffs2_raw_summary)); + + for(i=0; i<je32_to_cpu(node->s.sum_num); i++) { + + switch(je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype)) { + case JFFS2_NODETYPE_INODE : { + + struct jffs2_sum_inode_flash *spi; + spi = sp; + + printf ("%14s #ino %5d, version %5d, offset 0x%08x, totlen 0x%08x\n", + "", + je32_to_cpu (spi->inode), + je32_to_cpu (spi->version), + je32_to_cpu (spi->offset), + je32_to_cpu (spi->totlen)); + + sp += JFFS2_SUMMARY_INODE_SIZE; + break; + } + + case JFFS2_NODETYPE_DIRENT : { + + char name[255]; + struct jffs2_sum_dirent_flash *spd; + spd = sp; + + memcpy(name,spd->name,spd->nsize); + name [spd->nsize] = 0x0; + + printf ("%14s dirent offset 0x%08x, totlen 0x%08x, #pino %5d, version %5d, #ino %8d, nsize %8d, name %s \n", + "", + je32_to_cpu (spd->offset), + je32_to_cpu (spd->totlen), + je32_to_cpu (spd->pino), + je32_to_cpu (spd->version), + je32_to_cpu (spd->ino), + spd->nsize, + name); + + sp += JFFS2_SUMMARY_DIRENT_SIZE(spd->nsize); + break; + } + + default : + printf("Unknown summary node!\n"); + break; + } + } + + sm = (struct jffs2_sum_marker *) ((char *)p + je32_to_cpu(node->s.totlen) - sizeof(struct jffs2_sum_marker)); + + printf("%14s Sum Node Offset 0x%08x, Magic 0x%08x, Padded size 0x%08x\n", + "", + je32_to_cpu(sm->offset), + je32_to_cpu(sm->magic), + je32_to_cpu(node->s.padded)); + } + + p += PAD(je32_to_cpu (node->s.totlen)); + break; + } + + case JFFS2_NODETYPE_CLEANMARKER: + if (verbose) { + printf ("%8s Cleanmarker at 0x%08x, totlen 0x%08x\n", + obsolete ? "Obsolete" : "", + p - data, je32_to_cpu (node->u.totlen)); + } + p += PAD(je32_to_cpu (node->u.totlen)); + break; + + case JFFS2_NODETYPE_PADDING: + if (verbose) { + printf ("%8s Padding node at 0x%08x, totlen 0x%08x\n", + obsolete ? "Obsolete" : "", + p - data, je32_to_cpu (node->u.totlen)); + } + p += PAD(je32_to_cpu (node->u.totlen)); + break; + + case 0xffff: + p += 4; + empty += 4; + break; + + default: + if (verbose) { + printf ("%8s Unknown node at 0x%08x, totlen 0x%08x\n", + obsolete ? "Obsolete" : "", + p - data, je32_to_cpu (node->u.totlen)); + } + p += PAD(je32_to_cpu (node->u.totlen)); + dirty += PAD(je32_to_cpu (node->u.totlen)); } } @@ -461,168 +461,168 @@ void do_endianconvert (void) switch(je16_to_cpu(node->u.nodetype)) { - case JFFS2_NODETYPE_INODE: - - newnode.i.magic = cnv_e16 (node->i.magic); - newnode.i.nodetype = cnv_e16 (node->i.nodetype); - newnode.i.totlen = cnv_e32 (node->i.totlen); - newnode.i.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); - newnode.i.ino = cnv_e32 (node->i.ino); - newnode.i.version = cnv_e32 (node->i.version); - mode.v32 = node->i.mode.m; - mode = cnv_e32 (mode); - newnode.i.mode.m = mode.v32; - newnode.i.uid = cnv_e16 (node->i.uid); - newnode.i.gid = cnv_e16 (node->i.gid); - newnode.i.isize = cnv_e32 (node->i.isize); - newnode.i.atime = cnv_e32 (node->i.atime); - newnode.i.mtime = cnv_e32 (node->i.mtime); - newnode.i.ctime = cnv_e32 (node->i.ctime); - newnode.i.offset = cnv_e32 (node->i.offset); - newnode.i.csize = cnv_e32 (node->i.csize); - newnode.i.dsize = cnv_e32 (node->i.dsize); - newnode.i.compr = node->i.compr; - newnode.i.usercompr = node->i.usercompr; - newnode.i.flags = cnv_e16 (node->i.flags); - if (recalccrc) { - len = je32_to_cpu(node->i.csize); - newnode.i.data_crc = cpu_to_e32 ( crc32(0, p + sizeof (struct jffs2_raw_inode), len)); - } else - newnode.i.data_crc = cnv_e32 (node->i.data_crc); - - newnode.i.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_inode) - 8)); - - write (fd, &newnode, sizeof (struct jffs2_raw_inode)); - write (fd, p + sizeof (struct jffs2_raw_inode), PAD (je32_to_cpu (node->i.totlen) - sizeof (struct jffs2_raw_inode))); - - p += PAD(je32_to_cpu (node->i.totlen)); - break; - - case JFFS2_NODETYPE_DIRENT: - newnode.d.magic = cnv_e16 (node->d.magic); - newnode.d.nodetype = cnv_e16 (node->d.nodetype); - newnode.d.totlen = cnv_e32 (node->d.totlen); - newnode.d.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); - newnode.d.pino = cnv_e32 (node->d.pino); - newnode.d.version = cnv_e32 (node->d.version); - newnode.d.ino = cnv_e32 (node->d.ino); - newnode.d.mctime = cnv_e32 (node->d.mctime); - newnode.d.nsize = node->d.nsize; - newnode.d.type = node->d.type; - newnode.d.unused[0] = node->d.unused[0]; - newnode.d.unused[1] = node->d.unused[1]; - newnode.d.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_dirent) - 8)); - if (recalccrc) - newnode.d.name_crc = cpu_to_e32 ( crc32(0, p + sizeof (struct jffs2_raw_dirent), node->d.nsize)); - else - newnode.d.name_crc = cnv_e32 (node->d.name_crc); - - write (fd, &newnode, sizeof (struct jffs2_raw_dirent)); - write (fd, p + sizeof (struct jffs2_raw_dirent), PAD (je32_to_cpu (node->d.totlen) - sizeof (struct jffs2_raw_dirent))); - p += PAD(je32_to_cpu (node->d.totlen)); - break; - - case JFFS2_NODETYPE_CLEANMARKER: - case JFFS2_NODETYPE_PADDING: - newnode.u.magic = cnv_e16 (node->u.magic); - newnode.u.nodetype = cnv_e16 (node->u.nodetype); - newnode.u.totlen = cnv_e32 (node->u.totlen); - newnode.u.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); - - write (fd, &newnode, sizeof (struct jffs2_unknown_node)); - len = PAD(je32_to_cpu (node->u.totlen) - sizeof (struct jffs2_unknown_node)); - if (len > 0) - write (fd, p + sizeof (struct jffs2_unknown_node), len); - - p += PAD(je32_to_cpu (node->u.totlen)); - break; - - case JFFS2_NODETYPE_SUMMARY : { - struct jffs2_sum_marker *sm_ptr; - int i,sum_len; - int counter = 0; - - newnode.s.magic = cnv_e16 (node->s.magic); - newnode.s.nodetype = cnv_e16 (node->s.nodetype); - newnode.s.totlen = cnv_e32 (node->s.totlen); - newnode.s.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); - newnode.s.sum_num = cnv_e32 (node->s.sum_num); - newnode.s.cln_mkr = cnv_e32 (node->s.cln_mkr); - newnode.s.padded = cnv_e32 (node->s.padded); - - newnode.s.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_summary) - 8)); - - // summary header - p += sizeof (struct jffs2_raw_summary); - - // summary data - sum_len = je32_to_cpu (node->s.totlen) - sizeof (struct jffs2_raw_summary) - sizeof (struct jffs2_sum_marker); - - for (i=0; i<je32_to_cpu (node->s.sum_num); i++) { - union jffs2_sum_flash *fl_ptr; - - fl_ptr = (union jffs2_sum_flash *) p; + case JFFS2_NODETYPE_INODE: + + newnode.i.magic = cnv_e16 (node->i.magic); + newnode.i.nodetype = cnv_e16 (node->i.nodetype); + newnode.i.totlen = cnv_e32 (node->i.totlen); + newnode.i.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); + newnode.i.ino = cnv_e32 (node->i.ino); + newnode.i.version = cnv_e32 (node->i.version); + mode.v32 = node->i.mode.m; + mode = cnv_e32 (mode); + newnode.i.mode.m = mode.v32; + newnode.i.uid = cnv_e16 (node->i.uid); + newnode.i.gid = cnv_e16 (node->i.gid); + newnode.i.isize = cnv_e32 (node->i.isize); + newnode.i.atime = cnv_e32 (node->i.atime); + newnode.i.mtime = cnv_e32 (node->i.mtime); + newnode.i.ctime = cnv_e32 (node->i.ctime); + newnode.i.offset = cnv_e32 (node->i.offset); + newnode.i.csize = cnv_e32 (node->i.csize); + newnode.i.dsize = cnv_e32 (node->i.dsize); + newnode.i.compr = node->i.compr; + newnode.i.usercompr = node->i.usercompr; + newnode.i.flags = cnv_e16 (node->i.flags); + if (recalccrc) { + len = je32_to_cpu(node->i.csize); + newnode.i.data_crc = cpu_to_e32 ( crc32(0, p + sizeof (struct jffs2_raw_inode), len)); + } else + newnode.i.data_crc = cnv_e32 (node->i.data_crc); + + newnode.i.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_inode) - 8)); + + write (fd, &newnode, sizeof (struct jffs2_raw_inode)); + write (fd, p + sizeof (struct jffs2_raw_inode), PAD (je32_to_cpu (node->i.totlen) - sizeof (struct jffs2_raw_inode))); - switch (je16_to_cpu (fl_ptr->u.nodetype)) { - case JFFS2_NODETYPE_INODE: - - fl_ptr->i.nodetype = cnv_e16 (fl_ptr->i.nodetype); - fl_ptr->i.inode = cnv_e32 (fl_ptr->i.inode); - fl_ptr->i.version = cnv_e32 (fl_ptr->i.version); - fl_ptr->i.offset = cnv_e32 (fl_ptr->i.offset); - fl_ptr->i.totlen = cnv_e32 (fl_ptr->i.totlen); - p += sizeof (struct jffs2_sum_inode_flash); - counter += sizeof (struct jffs2_sum_inode_flash); - break; - - case JFFS2_NODETYPE_DIRENT: - fl_ptr->d.nodetype = cnv_e16 (fl_ptr->d.nodetype); - fl_ptr->d.totlen = cnv_e32 (fl_ptr->d.totlen); - fl_ptr->d.offset = cnv_e32 (fl_ptr->d.offset); - fl_ptr->d.pino = cnv_e32 (fl_ptr->d.pino); - fl_ptr->d.version = cnv_e32 (fl_ptr->d.version); - fl_ptr->d.ino = cnv_e32 (fl_ptr->d.ino); - p += sizeof (struct jffs2_sum_dirent_flash) + fl_ptr->d.nsize; - counter += sizeof (struct jffs2_sum_dirent_flash) + fl_ptr->d.nsize; - break; - - default : - printf("Unknown node in summary information!!! nodetype(%x)\n", je16_to_cpu (fl_ptr->u.nodetype)); - exit(EXIT_FAILURE); - break; - } - - } - - //pad - p += sum_len - counter; - - // summary marker - sm_ptr = (struct jffs2_sum_marker *) p; - sm_ptr->offset = cnv_e32 (sm_ptr->offset); - sm_ptr->magic = cnv_e32 (sm_ptr->magic); - p += sizeof (struct jffs2_sum_marker); + p += PAD(je32_to_cpu (node->i.totlen)); + break; - // generate new crc on sum data - newnode.s.sum_crc = cpu_to_e32 ( crc32(0, ((char *) node) + sizeof (struct jffs2_raw_summary), - je32_to_cpu (node->s.totlen) - sizeof (struct jffs2_raw_summary))); + case JFFS2_NODETYPE_DIRENT: + newnode.d.magic = cnv_e16 (node->d.magic); + newnode.d.nodetype = cnv_e16 (node->d.nodetype); + newnode.d.totlen = cnv_e32 (node->d.totlen); + newnode.d.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); + newnode.d.pino = cnv_e32 (node->d.pino); + newnode.d.version = cnv_e32 (node->d.version); + newnode.d.ino = cnv_e32 (node->d.ino); + newnode.d.mctime = cnv_e32 (node->d.mctime); + newnode.d.nsize = node->d.nsize; + newnode.d.type = node->d.type; + newnode.d.unused[0] = node->d.unused[0]; + newnode.d.unused[1] = node->d.unused[1]; + newnode.d.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_dirent) - 8)); + if (recalccrc) + newnode.d.name_crc = cpu_to_e32 ( crc32(0, p + sizeof (struct jffs2_raw_dirent), node->d.nsize)); + else + newnode.d.name_crc = cnv_e32 (node->d.name_crc); + + write (fd, &newnode, sizeof (struct jffs2_raw_dirent)); + write (fd, p + sizeof (struct jffs2_raw_dirent), PAD (je32_to_cpu (node->d.totlen) - sizeof (struct jffs2_raw_dirent))); + p += PAD(je32_to_cpu (node->d.totlen)); + break; - // write out new node header - write(fd, &newnode, sizeof (struct jffs2_raw_summary)); - // write out new summary data - write(fd, &node->s.sum, sum_len + sizeof (struct jffs2_sum_marker)); + case JFFS2_NODETYPE_CLEANMARKER: + case JFFS2_NODETYPE_PADDING: + newnode.u.magic = cnv_e16 (node->u.magic); + newnode.u.nodetype = cnv_e16 (node->u.nodetype); + newnode.u.totlen = cnv_e32 (node->u.totlen); + newnode.u.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); - break; - } + write (fd, &newnode, sizeof (struct jffs2_unknown_node)); + len = PAD(je32_to_cpu (node->u.totlen) - sizeof (struct jffs2_unknown_node)); + if (len > 0) + write (fd, p + sizeof (struct jffs2_unknown_node), len); - case 0xffff: - write (fd, p, 4); - p += 4; - break; + p += PAD(je32_to_cpu (node->u.totlen)); + break; - default: - printf ("Unknown node type: 0x%04x at 0x%08x, totlen 0x%08x\n", je16_to_cpu (node->u.nodetype), p - data, je32_to_cpu (node->u.totlen)); - p += PAD(je32_to_cpu (node->u.totlen)); + case JFFS2_NODETYPE_SUMMARY : { + struct jffs2_sum_marker *sm_ptr; + int i,sum_len; + int counter = 0; + + newnode.s.magic = cnv_e16 (node->s.magic); + newnode.s.nodetype = cnv_e16 (node->s.nodetype); + newnode.s.totlen = cnv_e32 (node->s.totlen); + newnode.s.hdr_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_unknown_node) - 4)); + newnode.s.sum_num = cnv_e32 (node->s.sum_num); + newnode.s.cln_mkr = cnv_e32 (node->s.cln_mkr); + newnode.s.padded = cnv_e32 (node->s.padded); + + newnode.s.node_crc = cpu_to_e32 (crc32 (0, &newnode, sizeof (struct jffs2_raw_summary) - 8)); + + // summary header + p += sizeof (struct jffs2_raw_summary); + + // summary data + sum_len = je32_to_cpu (node->s.totlen) - sizeof (struct jffs2_raw_summary) - sizeof (struct jffs2_sum_marker); + + for (i=0; i<je32_to_cpu (node->s.sum_num); i++) { + union jffs2_sum_flash *fl_ptr; + + fl_ptr = (union jffs2_sum_flash *) p; + + switch (je16_to_cpu (fl_ptr->u.nodetype)) { + case JFFS2_NODETYPE_INODE: + + fl_ptr->i.nodetype = cnv_e16 (fl_ptr->i.nodetype); + fl_ptr->i.inode = cnv_e32 (fl_ptr->i.inode); + fl_ptr->i.version = cnv_e32 (fl_ptr->i.version); + fl_ptr->i.offset = cnv_e32 (fl_ptr->i.offset); + fl_ptr->i.totlen = cnv_e32 (fl_ptr->i.totlen); + p += sizeof (struct jffs2_sum_inode_flash); + counter += sizeof (struct jffs2_sum_inode_flash); + break; + + case JFFS2_NODETYPE_DIRENT: + fl_ptr->d.nodetype = cnv_e16 (fl_ptr->d.nodetype); + fl_ptr->d.totlen = cnv_e32 (fl_ptr->d.totlen); + fl_ptr->d.offset = cnv_e32 (fl_ptr->d.offset); + fl_ptr->d.pino = cnv_e32 (fl_ptr->d.pino); + fl_ptr->d.version = cnv_e32 (fl_ptr->d.version); + fl_ptr->d.ino = cnv_e32 (fl_ptr->d.ino); + p += sizeof (struct jffs2_sum_dirent_flash) + fl_ptr->d.nsize; + counter += sizeof (struct jffs2_sum_dirent_flash) + fl_ptr->d.nsize; + break; + + default : + printf("Unknown node in summary information!!! nodetype(%x)\n", je16_to_cpu (fl_ptr->u.nodetype)); + exit(EXIT_FAILURE); + break; + } + + } + + //pad + p += sum_len - counter; + + // summary marker + sm_ptr = (struct jffs2_sum_marker *) p; + sm_ptr->offset = cnv_e32 (sm_ptr->offset); + sm_ptr->magic = cnv_e32 (sm_ptr->magic); + p += sizeof (struct jffs2_sum_marker); + + // generate new crc on sum data + newnode.s.sum_crc = cpu_to_e32 ( crc32(0, ((char *) node) + sizeof (struct jffs2_raw_summary), + je32_to_cpu (node->s.totlen) - sizeof (struct jffs2_raw_summary))); + + // write out new node header + write(fd, &newnode, sizeof (struct jffs2_raw_summary)); + // write out new summary data + write(fd, &node->s.sum, sum_len + sizeof (struct jffs2_sum_marker)); + + break; + } + + case 0xffff: + write (fd, p, 4); + p += 4; + break; + + default: + printf ("Unknown node type: 0x%04x at 0x%08x, totlen 0x%08x\n", je16_to_cpu (node->u.nodetype), p - data, je32_to_cpu (node->u.totlen)); + p += PAD(je32_to_cpu (node->u.totlen)); } } @@ -647,7 +647,7 @@ int main(int argc, char **argv) } // get image length - imglen = lseek(fd, 0, SEEK_END); + imglen = lseek(fd, 0, SEEK_END); lseek (fd, 0, SEEK_SET); data = malloc (imglen); |