#!/usr/bin/perl use File::Rdiff qw(:trace :nonblocking); trace_level(LOG_INFO); if ($ARGV[0] eq "signature") { open $basis, "<", $ARGV[1] or die "$ARGV[1]: $!"; open $sig, ">", $ARGV[2] or die "$ARGV[2]: $!"; my $job = new_sig File::Rdiff::Job; my $buf = new File::Rdiff::Buffers 4096; while ($job->iter($buf) == BLOCKED) { # fetch more input data $buf->avail_in or do { my $in; 65536 == sysread $basis, $in, 65536 or $buf->eof; $buf->in($in); }; print $sig $buf->out; } # the last time print $sig $buf->out; } elsif ($ARGV[0] eq "delta") { open $sig, "<$ARGV[1]" or die "$ARGV[1]: $!"; open $new, "<$ARGV[2]" or die "$ARGV[2]: $!"; open $delta, ">$ARGV[3]" or die "$ARGV[3]: $!"; # first load the signature into memory $sig = loadsig_file $sig; ref $sig or exit 1; $sig->build_hash_table; File::Rdiff::delta_file $sig, $new, $delta; } elsif ($ARGV[0] eq "patch") { open $base, "<$ARGV[1]" or die "$ARGV[1]: $!"; open $delta, "<$ARGV[2]" or die "$ARGV[2]: $!"; open $new, ">$ARGV[3]" or die "$ARGV[3]: $!"; File::Rdiff::patch_file $base, $delta, $new; } else { print <