#!/usr/bin/perl

@ARGV == 3 or die "Usage: $0 filename.img imagetype path_to_mar_bin\n  ex. $0 cdrom-changedisk.img cdrom\n\nPut the old images (*.img), new vmlinuz, new modules.dep and new *.mar files in a fresh directory, and update each image file one by one.";

$file = $ARGV[0];
$img = $ARGV[1];
$marbin = $ARGV[2];

sub __ { print @_, "\n"; system(@_); }
sub _ { __ @_; $? and die; }

$topdir = '/tmp/updimg';

print "Updating boot image file $file of type $img\n";

_ "rm -rf $topdir";
_ "mkdir $topdir";

_ "mkdir $topdir/img";
_ "mount -o loop $file $topdir/img";

$rdz = glob("$topdir/img/*.rdz");
$rdz or die "Could not glob rdz file in $topdir/img/*.rdz\n";

_ "zcat $rdz > /tmp/meuh";
_ "mkdir $topdir/initrd";
_ "mount -o loop /tmp/meuh $topdir/initrd";

print "\n\tOld sizes:\n";
print `ls -l $topdir/img/vmlinuz`;
print `ls -l $topdir/initrd/modules/modules.mar`;
system("df $topdir/img");
print "\n";

_ "cp -f vmlinuz $topdir/img/vmlinuz";
system("$marbin -l $topdir/initrd/modules/modules.mar | sort > $topdir/oldmar");
system("$marbin -l ${img}_modules.mar | sort > $topdir/newmar");
_ "cp -f ${img}_modules.mar $topdir/initrd/modules/modules.mar";
_ "cp -f modules.dep $topdir/initrd/modules/modules.dep";

_ "umount $topdir/initrd";
_ "gzip -c /tmp/meuh > $rdz";

print "\n\tNew sizes:\n";
print `ls -l vmlinuz`;
print `ls -l ${img}_modules.mar`;
system("df $topdir/img");
print "\nDiff from old to new marfiles:\n";
print `diff -u $topdir/oldmar $topdir/newmar`;
print "\n";

_ "umount $topdir/img";