summaryrefslogtreecommitdiff
path: root/jffs2dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'jffs2dump.c')
-rw-r--r--jffs2dump.c770
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);