setbookmark.pl
#!/usr/bin/perl use strict; # Syntax: perl setbookmark.pl onetimepad_file new_bookmark # This sets the value of the bookmark in the given one-time pad and erases the data # between the old bookmark and the bookmark. my $True = 1; my $False = 0; # Execution starts here &main; sub main() { my $intNumArgs = $#ARGV + 1; if ($intNumArgs != 2) { print "Syntax: perl setbookmark.pl onetimepad_file new_bookmark\n"; exit 1; } # Read the arguments on the command line my $strPadFilename = $ARGV[0]; my $lngNewBookmark = $ARGV[1]; my $lngCurrentBookmark = ReadBookmark($strPadFilename); if ($lngCurrentBookmark == 0) { exit 1; } print "Current bookmark is ".$lngCurrentBookmark."\n"; if ($lngNewBookmark <= $lngCurrentBookmark) { print "ERROR:New bookmark must be set after current bookmark\n"; exit 1; } my $lngFileSize = -s $strPadFilename; print "File size is ".$lngFileSize."\n"; if ($lngNewBookmark > $lngFileSize ) { print "ERROR:New bookmark is beyond the end of the file\n"; exit 1; } if (SetBookmarkAndDeleteData($strPadFilename, $lngCurrentBookmark, $lngNewBookmark) == $False) { exit 1; } exit 0; } sub ReadBookmark($) { my $strPadFilename = $_[0]; if (!open PAD_FILE, "<$strPadFilename") { print "ERROR:Can't open file $strPadFilename\n"; return 0; } # Handle the file as bytes instead of text binmode PAD_FILE; my $lngBookmark = unpack('L', <PAD_FILE>); close PAD_FILE; return $lngBookmark; } sub SetBookmarkAndDeleteData($$$) { my $strPadFilename = $_[0]; my $lngCurrentBookmark = $_[1]; my $lngNewBookmark = $_[2]; if (!open PAD_FILE, "+<$strPadFilename") { print "ERROR:Can't open file $strPadFilename\n"; return $False; } # Handle the file as bytes instead of text binmode PAD_FILE; # Write the new bookmark at the start of the file seek(PAD_FILE, 0, 0); print PAD_FILE pack('L', $lngNewBookmark); print "Bookmark updated to ".$lngNewBookmark."\n"; # Delete data between old and new bookmarks seek(PAD_FILE, $lngCurrentBookmark, 0); for(my $lngCounter = $lngCurrentBookmark; $lngCounter < $lngNewBookmark; $lngCounter++) { my $byte = 0; print PAD_FILE pack('C', $byte); } print "Data up to new bookmark deleted\n"; close PAD_FILE; return $True; }