Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use Getopt::Std;
- use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
- my $image = 1;
- our($opt_x, $opt_i);
- getopts('xi');
- $#ARGV == 0 || die "Usage $0 [-x] file";
- open(F, $ARGV[0]) || die "open $ARGV[0]";
- while (256 == (my $nr = sysread(F, my $hdr, 256))) {
- print "\n" if ($image > 1);
- print "Image: $image\n";
- my (
- $tag, $sig1, $sig2, $chipid, $boardid, $bigendian,
- $imagesize, $cfeaddr, $cfesize, $rootaddr, $rootsize, $kerneladdr, $kernelsize,
- $dual, $inactive, $info1, $info2, $u1, $u2,
- $totcrc, $rootcrc, $kerncrc, $z1, $z2, $hdrcrc,
- ) = unpack("a4a20a14a6a16a2a10a12a10a12a10a12a10a2a2a20a28a8a18NNNNNN", $hdr);
- if ($tag < 5 || $tag > 8) {
- printf "unknown tag %x\n", $tag;
- exit;
- }
- printf "tag: %x\nsig1: $sig1\nsig2: $sig2\nchipid: $chipid\nboardid: $boardid\n", $tag;
- printf "bigendian: $bigendian\nimage size: %d\ncfe addr: %d %x\ncfe size: %d next: %x\nroot addr: %d %x\nroot size: %d next: %x\nkernel addr: %d %x\nkernel size: %d next: %x\n",
- $imagesize, $cfeaddr, $cfeaddr, $cfesize, $cfeaddr+$cfesize,
- $rootaddr, $rootaddr, $rootsize, $rootaddr+$rootsize,
- $kerneladdr, $kerneladdr, $kernelsize, $kerneladdr+$kernelsize;
- printf "dual $dual inactive %x info1 $info1 info2 $info2 u1 $u1 u2 $u2\n", $inactive;
- printf "total crc: %x\nroot crc: %x\nkernel crc: %x\nheader crc: %x\n", $totcrc, $rootcrc, $kerncrc, $hdrcrc;
- if ($opt_x) {
- open(OF, ">header$image") || die "header"; syswrite(OF, $hdr); close(OF);
- }
- my $sub = substr($hdr, 0, 236);
- my $crc = Archive::Zip::computeCRC32($sub);
- $crc = ~$crc & 0xffffffff;
- print "BAD " if ($crc != $hdrcrc);
- printf "calculated header crc: %x\n", $crc;
- my $total = "";
- if ($cfesize > 0) {
- sysread(F, my $cfe, $cfesize) || die "read cfe";
- $total .= $cfe;
- my $crc = Archive::Zip::computeCRC32($cfe);
- $crc = ~$crc & 0xffffffff;
- printf "calculated cfe crc: %x\n", $crc;
- if ($opt_x) {
- open(OF, ">cfe$image") || die "cfe";
- syswrite(OF, $cfe, $cfesize);
- close(OF);
- }
- }
- if ($rootsize > 0) {
- sysread(F, my $root, $rootsize) || die "read rootfs";
- $total .= $root;
- my $crc = Archive::Zip::computeCRC32($root);
- $crc = ~$crc & 0xffffffff;
- print "BAD " if ($crc != $rootcrc);
- printf "calculated rootfs crc: %x\n", $crc;
- if ($opt_x) {
- open(OF, ">rootfs$image") || die "rootfs";
- syswrite(OF, $root, $rootsize);
- close(OF);
- }
- }
- if ($kernelsize > 0) {
- sysread(F, my $kernel, $kernelsize) || die "read kernel";
- $total .= $kernel;
- my $crc = Archive::Zip::computeCRC32($kernel);
- $crc = ~$crc & 0xffffffff;
- print "BAD " if ($crc != $kerncrc);
- printf "calculated kernel crc: %x\n", $crc;
- if ($opt_x) {
- open(OF, ">kernel$image") || die "kernel";
- syswrite(OF, $kernel, $kernelsize);
- close(OF);
- }
- }
- my $crc = Archive::Zip::computeCRC32($total);
- $crc = ~$crc & 0xffffffff;
- print "BAD " if ($crc != $totcrc);
- printf "calculated total crc: %x\n", $crc;
- $image++;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement