Archive-Tar-Wrapper-IPC-Cmd
view release on metacpan or search on metacpan
lib/Archive/Tar/Wrapper/IPC/Cmd.pm view on Meta::CPAN
chdir $cwd or LOGDIE "Cannot chdir to $cwd";
return undef;
}
WARN $err if $err;
chdir $cwd or LOGDIE "Cannot chdir to $cwd";
return 1;
}
###########################################
sub is_compressed {
###########################################
my($self, $tarfile) = @_;
return 1 if $tarfile =~ /\.t?gz$/i;
# Sloppy check for gzip files
open FILE, "<$tarfile" or die "Cannot open $tarfile";
binmode FILE;
my $read = sysread(FILE, my $two, 2, 0) or die "Cannot sysread";
close FILE;
return 1 if
ord(substr($two, 0, 1)) eq 0x1F and
ord(substr($two, 1, 1)) eq 0x8B;
return 0;
}
###########################################
sub locate {
###########################################
my($self, $rel_path) = @_;
my $real_path = File::Spec->catfile($self->{tardir}, $rel_path);
if(-e $real_path) {
DEBUG "$real_path exists";
return $real_path;
}
DEBUG "$real_path doesn't exist";
WARN "$rel_path not found in tarball";
return undef;
}
###########################################
sub add {
###########################################
my($self, $rel_path, $path_or_stringref, $opts) = @_;
if($opts) {
if(!ref($opts) or ref($opts) ne 'HASH') {
LOGDIE "Option parameter given to add() not a hashref.";
}
}
my $perm = $opts->{perm} if defined $opts->{perm};
my $uid = $opts->{uid} if defined $opts->{uid};
my $gid = $opts->{gid} if defined $opts->{gid};
my $binmode = $opts->{binmode} if defined $opts->{binmode};
my $target = File::Spec->catfile($self->{tardir}, $rel_path);
my $target_dir = dirname($target);
if( ! -d $target_dir ) {
if( ref($path_or_stringref) ) {
$self->add( dirname( $rel_path ), dirname( $target_dir ) );
} else {
$self->add( dirname( $rel_path ), dirname( $path_or_stringref ) );
}
}
if(ref($path_or_stringref)) {
open FILE, ">$target" or LOGDIE "Can't open $target ($!)";
if(defined $binmode) {
binmode FILE, $binmode;
}
print FILE $$path_or_stringref;
close FILE;
} elsif( -d $path_or_stringref ) {
# perms will be fixed further down
mkpath($target, 0, 0755) unless -d $target;
} else {
copy $path_or_stringref, $target or
LOGDIE "Can't copy $path_or_stringref to $target ($!)";
}
if(defined $uid) {
chown $uid, -1, $target or
LOGDIE "Can't chown $target uid to $uid ($!)";
}
if(defined $gid) {
chown -1, $gid, $target or
LOGDIE "Can't chown $target gid to $gid ($!)";
}
if(defined $perm) {
chmod $perm, $target or
LOGDIE "Can't chmod $target to $perm ($!)";
}
if(!defined $uid and
!defined $gid and
!defined $perm and
!ref($path_or_stringref)) {
perm_cp($path_or_stringref, $target) or
LOGDIE "Can't perm_cp $path_or_stringref to $target ($!)";
}
1;
}
######################################
sub perm_cp {
######################################
# Lifted from Ben Okopnik's
# http://www.linuxgazette.com/issue87/misc/tips/cpmod.pl.txt
my $perms = perm_get($_[0]);
perm_set($_[1], $perms);
}
######################################
sub perm_get {
######################################
my($filename) = @_;
my @stats = (stat $filename)[2,4,5] or
LOGDIE "Cannot stat $filename ($!)";
return \@stats;
}
######################################
sub perm_set {
######################################
my($filename, $perms) = @_;
chown($perms->[1], $perms->[2], $filename) or
LOGDIE "Cannot chown $filename ($!)";
chmod($perms->[0] & 07777, $filename) or
LOGDIE "Cannot chmod $filename ($!)";
}
###########################################
sub remove {
###########################################
my($self, $rel_path) = @_;
my $target = File::Spec->catfile($self->{tardir}, $rel_path);
rmtree($target) or LOGDIE "Can't rmtree $target ($!)";
}
###########################################
sub list_all {
###########################################
my($self) = @_;
my @entries = ();
$self->list_reset();
( run in 1.941 second using v1.01-cache-2.11-cpan-ceb78f64989 )