@@ -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);