6 @EXPORT = qw(getcwd fastcwd);
7 @EXPORT_OK = qw(chdir);
10 # By Brandon S. Allbery
12 # Usage: $cwd = getcwd();
16 my($dotdots, $cwd, @pst, @cst, $dir, @tst);
18 unless (@cst = stat('.'))
27 $dotdots .= '/' if $dotdots;
30 unless (opendir(PARENT, $dotdots))
32 warn "opendir($dotdots): $!";
35 unless (@cst = stat($dotdots))
37 warn "stat($dotdots): $!";
41 if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
49 unless (defined ($dir = readdir(PARENT)))
51 warn "readdir($dotdots): $!";
55 unless (@tst = lstat("$dotdots/$dir"))
57 warn "lstat($dotdots/$dir): $!";
62 while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
68 chop($cwd); # drop the trailing /
76 # Usage: $cwd = &fastcwd;
78 # This is a faster version of getcwd. It's also more dangerous because
79 # you might chdir out of a directory that you can't chdir back into.
82 my($odev, $oino, $cdev, $cino, $tdev, $tino);
86 ($cdev, $cino) = stat('.');
89 ($odev, $oino) = ($cdev, $cino);
91 ($cdev, $cino) = stat('.');
92 last if $odev == $cdev && $oino == $cino;
95 $direntry = readdir(DIR);
96 next if $direntry eq '.';
97 next if $direntry eq '..';
99 last unless defined $direntry;
100 ($tdev, $tino) = lstat($direntry);
101 last unless $tdev != $odev || $tino != $oino;
104 unshift(@path, $direntry);
106 chdir($path = '/' . join('/', @path));
111 # keeps track of current working directory in PWD environment var
113 # $RCSfile: pwd.pl,v $$Revision: 4.1 $$Date: 92/08/07 18:24:11 $
125 my($dd,$di) = stat('.');
126 my($pd,$pi) = stat($ENV{'PWD'});
127 if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
128 chop($ENV{'PWD'} = `pwd`);
132 chop($ENV{'PWD'} = `pwd`);
134 if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|) {
135 my($pd,$pi) = stat($2);
136 my($dd,$di) = stat($1);
137 if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
146 chdir_init() unless $chdir_init;
147 return 0 unless (CORE::chdir $newdir);
148 if ($newdir =~ m#^/#) {
149 $ENV{'PWD'} = $newdir;
151 my(@curdir) = split(m#/#,$ENV{'PWD'});
152 @curdir = '' unless @curdir;
153 foreach $component (split(m#/#, $newdir)) {
154 next if $component eq '.';
155 pop(@curdir),next if $component eq '..';
156 push(@curdir,$component);
158 $ENV{'PWD'} = join('/',@curdir) || '/';