open(IN, "<", $oldfile) or die "can't open $oldfile: $!";
open(OUT, ">", $newfile) or die "can't open $newfile: $!";
$blksize = (stat IN)[11] || 16384; # preferred block size?
while (1) {
$len = sysread IN, $buf, $blksize);
if (!defined $len) {
next if $! =~ /^Interrupted/; # ^Z and fg on EINTR
die "System read error: $!\n";
}
last unless $len;
$offset = 0;
while ($len) { # Handle partial writes.
defined($written = syswrite OUT, $buf, $len, $offset)
or die "System write error: $!\n";
$len -= $written;
$offset += $written;
};
}
close(IN);
close(OUT);