aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xcore/checksumiso.pl21
1 files changed, 18 insertions, 3 deletions
diff --git a/core/checksumiso.pl b/core/checksumiso.pl
index b5527428..9b8c3ee5 100755
--- a/core/checksumiso.pl
+++ b/core/checksumiso.pl
@@ -9,11 +9,25 @@ use integer;
($file) = @ARGV;
-open(FILE, '+<', $file) or die "$0: Cannot open $file: $!\n";
+open(FILE, '+<', $file) or die "$0: cannot open $file: $!\n";
binmode FILE;
+@fstat = stat(FILE) or die "$0: stat $file: $!\n";
+if (!$fstat[7]) {
+ die "$0: $file: cannot query length\n";
+}
+
+# Pad file to a multiple of 2048 bytes
+$frac = $fstat[7] % 2048;
+if ($frac) {
+ seek(FILE,$fstat[7],0)
+ or die "$0: $file: cannot seek to end\n";
+ print FILE "\0" x (2048-$frac);
+}
+
+# Checksum the file post header
if ( !seek(FILE,64,0) ) {
- die "$0: Cannot seek past header\n";
+ die "$0: $file: cannot seek past header\n";
}
$csum = 0;
@@ -25,8 +39,9 @@ while ( ($n = read(FILE, $dw, 4)) > 0 ) {
$bytes += $n;
}
+# Update header
if ( !seek(FILE,16,0) ) {
- die "$0: Cannot seek to header\n";
+ die "$0: $file: cannot seek to header\n";
}
print FILE pack("VV", $bytes, $csum);