home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2000 May
/
Chip_2000-05_cd1.bin
/
zkuste
/
Perl
/
ActivePerl-5.6.0.613.msi
/
䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥
/
_e62e349c76b890402ed10c624633518a
< prev
next >
Wrap
Text File
|
2000-03-15
|
2KB
|
84 lines
#
# Search for our Unix signature in text and binary files
# and replace it with the real prefix ($Config{prefix} by default).
#
package PPM::RelocPerl;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(RelocPerl);
use File::Find;
use Config;
use strict;
# We have to build up this variable, otherwise
# PPM will mash it when it upgrades itself.
my $frompath_default
= '/tmp' . '/.ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZpErLZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZperl'
;
my ($topath, $frompath);
sub wanted {
if (-l) {
return; # do nothing for symlinks
}
elsif (-B) {
check_for_frompath($_, 1); # binary file edit
}
elsif (-e && -s && -f) {
check_for_frompath($_, 0); # text file edit
}
}
sub check_for_frompath {
my ($file, $binmode) = @_;
local(*F, $_);
open(F, "<$file") or die "Can't open `$file': $!";
binmode F if $binmode;
while (<F>) {
if (/\Q$frompath\E/o) {
close F;
edit_it($file, $binmode);
last;
}
}
# implicit close of F;
}
sub edit_it
{
my ($file, $binmode) = @_;
my $nullpad = length($frompath) - length($topath);
$nullpad = "\0" x $nullpad;
local $/;
# Force the file to be writable
my $mode = (stat($file))[2] & 07777;
chmod $mode | 0222, $file;
open(F, "+<$file") or die "Couldn't open $file: $!";
binmode(F) if $binmode;
my $dat = <F>;
if ($binmode) {
$dat =~ s|\Q$frompath\E(.*?)\0|$topath$1$nullpad\0|gs;
} else {
$dat =~ s|\Q$frompath\E|$topath|gs;
}
seek(F, 0, 0) or die "Couldn't seek on $file: $!";
print F $dat;
close(F);
# Restore the permissions
chmod $mode, $file;
}
sub RelocPerl
{
my ($dir, $opt_topath, $opt_frompath) = @_;
$topath = defined $opt_topath ? $opt_topath : $Config{'prefix'};
$frompath = defined $opt_frompath ? $opt_frompath : $frompath_default;
find(\&wanted, $dir);
}
1;