1;# pwd.pl - keeps track of current working directory in PWD environment var 2;# 3# 4# This library is no longer being maintained, and is included for backward 5# compatibility with Perl 4 programs which may require it. 6# 7# In particular, this should not be used as an example of modern Perl 8# programming techniques. 9# 10# Suggested alternative: Cwd 11# 12;# $RCSfile: pwd.pl,v $$Revision: 1.7 $$Date: 2003/12/03 03:02:36 $ 13;# 14;# $Log: pwd.pl,v $ 15;# Revision 1.7 2003/12/03 03:02:36 millert 16;# Resolve conflicts for perl 5.8.2, remove old files, and add OpenBSD-specific scaffolding 17;# 18;# 19;# Usage: 20;# require "pwd.pl"; 21;# &initpwd; 22;# ... 23;# &chdir($newdir); 24 25package pwd; 26 27sub main'initpwd { 28 if ($ENV{'PWD'}) { 29 local($dd,$di) = stat('.'); 30 local($pd,$pi) = stat($ENV{'PWD'}); 31 if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) { 32 chop($ENV{'PWD'} = `pwd`); 33 } 34 } 35 else { 36 chop($ENV{'PWD'} = `pwd`); 37 } 38 if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) { 39 local($pd,$pi) = stat($2); 40 local($dd,$di) = stat($1); 41 if (defined $pd and defined $dd and $di == $pi and $dd == $pd) { 42 $ENV{'PWD'}="$2$3"; 43 } 44 } 45} 46 47sub main'chdir { 48 local($newdir) = shift; 49 $newdir =~ s|/{2,}|/|g; 50 if (chdir $newdir) { 51 if ($newdir =~ m#^/#) { 52 $ENV{'PWD'} = $newdir; 53 } 54 else { 55 local(@curdir) = split(m#/#,$ENV{'PWD'}); 56 @curdir = '' unless @curdir; 57 foreach $component (split(m#/#, $newdir)) { 58 next if $component eq '.'; 59 pop(@curdir),next if $component eq '..'; 60 push(@curdir,$component); 61 } 62 $ENV{'PWD'} = join('/',@curdir) || '/'; 63 } 64 } 65 else { 66 0; 67 } 68} 69 701; 71