summaryrefslogtreecommitdiff
path: root/checksumiso.pl
diff options
context:
space:
mode:
Diffstat (limited to 'checksumiso.pl')
-rwxr-xr-xchecksumiso.pl36
1 files changed, 36 insertions, 0 deletions
diff --git a/checksumiso.pl b/checksumiso.pl
new file mode 100755
index 00000000..b5527428
--- /dev/null
+++ b/checksumiso.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+#
+# Construct a checksum for isolinux*.bin, compatible
+# with an mkisofs boot-info-table
+#
+
+use bytes;
+use integer;
+
+($file) = @ARGV;
+
+open(FILE, '+<', $file) or die "$0: Cannot open $file: $!\n";
+binmode FILE;
+
+if ( !seek(FILE,64,0) ) {
+ die "$0: Cannot seek past header\n";
+}
+
+$csum = 0;
+$bytes = 64;
+while ( ($n = read(FILE, $dw, 4)) > 0 ) {
+ $dw .= "\0\0\0\0"; # Pad to at least 32 bits
+ ($v) = unpack("V", $dw);
+ $csum = ($csum + $v) & 0xffffffff;
+ $bytes += $n;
+}
+
+if ( !seek(FILE,16,0) ) {
+ die "$0: Cannot seek to header\n";
+}
+
+print FILE pack("VV", $bytes, $csum);
+
+close(FILE);
+
+exit 0;