diff --git a/jffs2dump.c b/jffs2dump.c index 9e13e98..63b3753 100644 --- a/jffs2dump.c +++ b/jffs2dump.c @@ -460,7 +460,9 @@ void do_endianconvert (void) switch(je16_to_cpu(node->u.nodetype)) { - case JFFS2_NODETYPE_INODE: + case JFFS2_NODETYPE_INODE:{ + jint16_t kdev[2]; + uint32_t is_dev; newnode.i.magic = cnv_e16 (node->i.magic); newnode.i.nodetype = cnv_e16 (node->i.nodetype); @@ -483,19 +485,39 @@ void do_endianconvert (void) newnode.i.compr = node->i.compr; newnode.i.usercompr = node->i.usercompr; newnode.i.flags = cnv_e16 (node->i.flags); + + is_dev = S_ISCHR(jemode_to_cpu(node->i.mode)) || S_ISBLK(jemode_to_cpu(node->i.mode)); + if (is_dev){ + /* read major, minor and padding */ + memcpy (kdev, p + sizeof (struct jffs2_raw_inode), sizeof (kdev)); + /*swap major and minor, to be in the right order*/ + kdev[0]=cnv_e16(kdev[0]); + if(!recalccrc) + printf("Recalc crc is disabled, data crc of device files will be corrupt!!!\n"); + } + + if (recalccrc) { len = je32_to_cpu(node->i.csize); - newnode.i.data_crc = cpu_to_e32 ( mtd_crc32(0, p + sizeof (struct jffs2_raw_inode), len)); + if (is_dev) + newnode.i.data_crc = cpu_to_e32 ( mtd_crc32(0, kdev, len)); + else + newnode.i.data_crc = cpu_to_e32 ( mtd_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 (mtd_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))); + + if (is_dev) + write (fd, kdev, sizeof (kdev)); + else + 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);