#!/usr/bin/perl
$^W=1;
use strict;

use File::Basename;
use Fcntl qw(:DEFAULT :seek);

$#ARGV==1 or
	die('usage: ',basename($0),' source_file target_file',"\n");

my $bs=1048576;
if(exists($ENV{bs})){
	$bs=$ENV{bs};
	$bs =~ /^[1-9]\d*$/ or
		die ('bad value (',$bs,') for bs',"\n");
};
$bs+=0;

-b $ARGV[1] && ! -l $ARGV[1] or die ("$ARGV[1] is not a block device\n");

open(IF,'<',$ARGV[0]) or die "Can't open $ARGV[0]: $!";
binmode(IF) or die "binmode failed on $ARGV[0]: $!";
sysopen(OF,$ARGV[1],O_RDWR) or die "Can't open $ARGV[1]: $!";
binmode(OF) or die "binmode failed on $ARGV[1]: $!";

{
	local $/=\$bs;
	my $i;
	my $ib;
	my $o;
	my $ob;
	while(1){
		$ib=read(IF,$i,$bs);
		if($ib){
		}elsif(defined($ib)&&$ib==0){
			# EOF, we're done
			exit(0);
		}elsif(defined($ib)&&$ib!=0){
			# should be unreachable
			die("\$ib defined ($ib) and not zero\n");
		}else{
			die "read error on $ARGV[0]: $!";
		};
		$ob=read(OF,$o,$bs);
		if(defined($ob)){
			unless($i eq $o){
				# not matched need to sync up OF
				seek(OF,-1 * $ob,SEEK_CUR) or
					die("seek failed on $ARGV[1]: $!\n");
				print OF ($i) or
					die("print failed on $ARGV[1]: $!\n");
			}
		}else{
			die "read error on $ARGV[1]: $!";
		};
	};
};
