1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#!/usr/bin/perl
use strict;
sub getcf ()
{
local *FH = shift @_;
my $size = shift @_;
my $buf;
read(FH, $buf, $size);
return $buf;
}
sub mkdir_p ()
{
my $fullpath = shift @_;
my @list;
if (-d $fullpath) {
return;
}
$fullpath =~ s/\/+$//go;
$fullpath =~ s/^~(?!\w)/$ENV{HOME}/so;
$fullpath =~ s/\/$//so;
@list = split(/\//so, $fullpath);
for (my $i = 0; $i < scalar(@list); ++$i) {
my $dir = join("/", @list[0..$i]);
if ($dir eq "") {
next;
}
if (!-e $dir && !mkdir($dir)) {
return 0;
}
}
return 1;
}
sub mkdir_p_stripbase ()
{
my $s = shift @_;
$s =~ s{^(.*)/.*}{$1}is;
return &mkdir_p($s);
}
sub transfer ()
{
local *OUT = shift @_;
local *IN = shift @_;
my $size = shift @_;
my $offset = shift @_;
my $saved_offset;
my $buf;
if (defined($offset)) {
$saved_offset = tell(IN);
seek(IN, $offset, 0);
}
while ($size > 0) {
my $rem = ($size > 4096) ? 4096 : $size;
read(IN, $buf, $rem);
print OUT $buf;
$size -= $rem;
}
if (defined($offset)) {
seek(IN, $saved_offset, 0);
}
return;
}
1;
|