#############################################################################
## Name: InitLib.pm
## Purpose: LibZip::InitLib
## Author: Graciliano M. P.
## Modified by:
## Created: 2004-06-06
## RCS-ID:
## Copyright: (c) 2004 Graciliano M. P.
## Licence: This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself
#############################################################################
package LibZip::InitLib ;
BEGIN { $INC{'LibZip/InitLib.pm'} = 1 if !$INC{'LibZip/InitLib.pm'} ;}
$VERSION = '0.01' ;
no warnings ;
########
# VARS #
########
my ( @INC_ORG , @DIRTMP ) ;
$CALL_BEGIN = 0 if !defined $CALL_BEGIN ;
## $LIBZIP , $LIBTMP , $LIBTMPFIX , $FILETMP , @LYB
###########
# ALIASES #
###########
sub LIBZIP { begin() ; "$LIBZIP" ;}
sub LIBTMP { begin() ; "$LIBTMP" ;}
#########
# BEGIN #
#########
sub begin {
return if $CALL_BEGIN ;
$CALL_BEGIN = 1 ;
if (-d './lib') { splice(@INC,-1,0,'./lib') ;}
@LYB = (0..9,'a'..'z','A'..'Z') ;
define_lib() ;
}
####################
# DEFINE_REAL_PATH #
####################
sub define_real_path {
eval{ require FindBin ;};
if ( !$@ ) {
if ( $LIBZIP !~ /^(?:\w+:\/|\/)/ ) {
$LIBZIP =~ s/^\.?\/*// ;
$LIBZIP = "$FindBin::RealBin/$LIBZIP" ;
}
if ( $LIBTMP !~ /^(?:\w+:\/|\/)/ ) {
my $real_libtmp = $LIBTMP ;
$real_libtmp =~ s/^\.?\/*// ;
$real_libtmp = "$FindBin::RealBin/$real_libtmp" ;
foreach my $INC_i ( @INC ) {
next if ref $INC_i ;
if ( $INC_i eq $LIBTMP ) { $INC_i = $real_libtmp ;}
elsif ( $INC_i =~ /^\Q$LIBTMP\E[\\\/](.*)/ ) { $INC_i = "$real_libtmp/$1" ;}
}
$LIBTMP = $real_libtmp ;
}
if ( $FILETMP !~ /^(?:\w+:\/|\/)/ ) {
$FILETMP =~ s/^\.?\/*// ;
$FILETMP = "$FindBin::RealBin/$FILETMP" ;
}
if ( $^X !~ /^(?:\w+:\/|\/)/ ) {
my ($name) = ( $^X =~ /([^\\\/]+)$/ );
$^X = "$FindBin::RealBin/$name" ;
}
$0 = $FindBin::RealScript = $FindBin::Script = $^X ;
my $fix_lib = "$FindBin::RealBin/lib" ;
if ( -d $fix_lib ) { unshift (@INC, $fix_lib) ;}
}
if ($^O=~/(msw|win|dos)/i && $^X !~ /\.exe$/ && -e "$^X.exe") { $^X .= '.exe' ;}
if ( LibZip::lib_has_dynaLoader() ) {
delete $INC{'DynaLoader.pm'} ;
require DynaLoader ;
my $bootstrap = \&DynaLoader::bootstrap ;
*DynaLoader::bootstrap = sub {
LibZip::check_pack_dep("$_[0].pm") if defined &LibZip::check_pack_dep ;
&$bootstrap(@_) ;
}
}
$@ = undef ;
my (@inc_ok , %inc_ok) ;
foreach my $INC_i ( @INC ) {
if ( ref $INC_i ) { push(@inc_ok , $INC_i) ;}
else {
$INC_i =~ s/[\\\/]+$// ;
push(@inc_ok , $INC_i) if !$inc_ok{$INC_i}++ ;
}
}
@INC = @inc_ok ;
return ;
}
##############
# DEFINE_LIB #
##############
sub define_lib {
my @find_lib = find_lib() ;
$LIBZIP = find_file('lib.zip',@find_lib,'.') ;
my $libtmp ;
foreach my $find_lib_i ( @find_lib ) {
if ($find_lib_i =~ /[\\\/]site$/i && $find_lib_i =~ /perl/) {
my $tmp_lib = "$find_lib_i/libzip-tmp" ;
if (! -d $tmp_lib) { mkdir($tmp_lib,0775) ;}
if (-d $tmp_lib && -r $tmp_lib && -w $tmp_lib) { $libtmp = $tmp_lib ; last ;}
}
}
if ($libtmp eq '') {
foreach my $find_lib_i ( @find_lib ) {
if ($find_lib_i =~ /[\\\/]lib$/i && $find_lib_i =~ /perl/) {
my $tmp_lib = "$find_lib_i/libzip-tmp" ;
if (! -d $tmp_lib) { mkdir($tmp_lib,0775) ;}
if (-d $tmp_lib && -r $tmp_lib && -w $tmp_lib) { $libtmp = $tmp_lib ; last ;}
}
}
}
if ($libtmp eq '') {
my $tmp = find_file('libzip-tmp',@find_lib,'.') ;
if ( -d $tmp ) {
$libtmp = $tmp ;
$LIBTMPFIX = 1 ;
}
}
if ($libtmp eq '') { $libtmp = new_tempdir('.') ;}
$LIBTMP = $libtmp ;
push(@INC , $LIBTMP) ;
$FILETMP = "$LIBTMP/pm-$$-zip.tmp" ;
open (FILETMP,">$FILETMP") ;
##print "DEFINED>> $LIBZIP >> $LIBTMP >>$^X\n" ;
}
###############
# NEW_TEMPDIR #
###############
sub new_tempdir {
my ( $lib ) = @_ ;
my $rand ;
while(length($rand) < 4) { $rand .= $LYB[rand(@LYB)] ;}
my $file = "$lib/libzip-$$-$rand-tmp" ;
if (-e $file) { $file = &new_tempdir($_[0],1) ;}
if (! $_[1]) {
mkdir($file,0775) ;
push(@DIRTMP , $file) ;
}
return( $file ) ;
}
############
# FIND_LIB #
############
sub find_lib {
@INC_ORG = @INC if !@INC_ORG ;
my @find_lib = @INC_ORG ;
if ( $^X !~ /(?:^|[\\\/])perl(?:\.\w+)?$/i ) {
my $exec_path = $^X ;
$exec_path =~ s/[\\\/]+[^\\\/]+$//gs ;
$exec_path =~ s/[\\\/]+$// ;
$exec_path .= "/lib" ;
push(@find_lib , $exec_path) if -d $exec_path ;
}
foreach my $find_lib_i ( @find_lib ) { $find_lib_i =~ s/[\\\/]+[^\\\/]+[\\\/]*$// ;}
return @find_lib ;
}
#######
# END #
#######
sub end {
foreach my $DIRTMP_i ( @DIRTMP ) { rmdir($DIRTMP_i) ;}
}
sub END { &end ;}
#######
# END #
#######
1;