4 use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
7 my $xs_version = $VERSION;
10 @ISA = qw/ Exporter /;
11 @EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
12 push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32';
13 @EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
15 # sys_cwd may keep the builtin command
17 # All the functionality of this module may provided by builtins,
18 # there is no sense to process the rest of the file.
19 # The best choice may be to have this in BEGIN, but how to return from BEGIN?
24 *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
29 *fast_abs_path = \&sys_abspath if defined &sys_abspath;
30 *abs_path = \&fast_abs_path;
31 *realpath = \&fast_abs_path;
32 *fast_realpath = \&fast_abs_path;
37 # Need to look up the feature settings on VMS. The preferred way is to use the
38 # VMS::Feature module, but that may not be available to dual life modules.
43 if (eval { local $SIG{__DIE__};
45 pop @INC if $INC[-1] eq '.';
46 require VMS::Feature; }) {
52 # Need to look up the UNIX report mode. This may become a dynamic mode
56 if ($use_vms_feature) {
57 $unix_rpt = VMS::Feature::current("filename_unix_report");
59 my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
60 $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
65 # Need to look up the EFS character set mode. This may become a dynamic
69 if ($use_vms_feature) {
70 $efs = VMS::Feature::current("efs_charset");
72 my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
73 $efs = $env_efs =~ /^[ET1]/i;
79 # If loading the XS stuff doesn't work, we can fall back to pure perl
80 if(! defined &getcwd && defined &DynaLoader::boot_DynaLoader) {
81 eval {#eval is questionable since we are handling potential errors like
82 #"Cwd object version 3.48 does not match bootstrap parameter 3.50
83 #at lib/DynaLoader.pm line 216." by having this eval
86 XSLoader::load( __PACKAGE__, $xs_version);
89 push @ISA, 'DynaLoader';
90 __PACKAGE__->bootstrap( $xs_version );
95 # Big nasty table of function aliases
101 getcwd => '_vms_cwd',
102 fastcwd => '_vms_cwd',
103 fastgetcwd => '_vms_cwd',
104 abs_path => '_vms_abs_path',
105 fast_abs_path => '_vms_abs_path',
110 # We assume that &_NT_cwd is defined as an XSUB or in the core.
113 fastcwd => '_NT_cwd',
114 fastgetcwd => '_NT_cwd',
115 abs_path => 'fast_abs_path',
116 realpath => 'fast_abs_path',
122 getcwd => '_dos_cwd',
123 fastgetcwd => '_dos_cwd',
124 fastcwd => '_dos_cwd',
125 abs_path => 'fast_abs_path',
128 # QNX4. QNX6 has a $os of 'nto'.
132 getcwd => '_qnx_cwd',
133 fastgetcwd => '_qnx_cwd',
134 fastcwd => '_qnx_cwd',
135 abs_path => '_qnx_abs_path',
136 fast_abs_path => '_qnx_abs_path',
144 abs_path => 'fast_abs_path',
145 realpath => 'fast_abs_path',
151 getcwd => '_epoc_cwd',
152 fastgetcwd => '_epoc_cwd',
153 fastcwd => '_epoc_cwd',
154 abs_path => 'fast_abs_path',
162 abs_path => 'fast_abs_path',
167 getcwd => '_backtick_pwd',
168 fastgetcwd => '_backtick_pwd',
169 fastcwd => '_backtick_pwd',
170 abs_path => 'fast_abs_path',
174 $METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
177 # Find the pwd command in the expected locations. We assume these
178 # are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
179 # so everything works under taint mode.
181 if($^O ne 'MSWin32') {
182 foreach my $try ('/bin/pwd',
184 '/QOpenSys/bin/pwd', # OS/400 PASE.
193 # Android has a built-in pwd. Using $pwd_cmd will DTRT if
194 # this perl was compiled with -Dd_useshellcmds, which is the
195 # default for Android, but the block below is needed for the
196 # miniperl running on the host when cross-compiling, and
197 # potentially for native builds with -Ud_useshellcmds.
198 if ($^O =~ /android/) {
199 # If targetsh is executable, then we're either a full
200 # perl, or a miniperl for a native build.
201 if (-x $Config::Config{targetsh}) {
202 $pwd_cmd = "$Config::Config{targetsh} -c pwd"
205 my $sh = $Config::Config{sh} || (-x '/system/bin/sh' ? '/system/bin/sh' : 'sh');
206 $pwd_cmd = "$sh -c pwd"
210 my $found_pwd_cmd = defined($pwd_cmd);
212 # Isn't this wrong? _backtick_pwd() will fail if someone has
213 # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
214 # See [perl #16774]. --jhi
219 sub _carp { require Carp; Carp::carp(@_) }
220 sub _croak { require Carp; Carp::croak(@_) }
222 # The 'natural and safe form' for UNIX (pwd may be setuid root)
225 # Localize %ENV entries in a way that won't create new hash keys.
226 # Under AmigaOS we don't want to localize as it stops perl from
227 # finding 'sh' in the PATH.
228 my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos";
229 local @ENV{@localize} if @localize;
231 my $cwd = `$pwd_cmd`;
232 # Belt-and-suspenders in case someone said "undef $/".
234 # `pwd` may fail e.g. if the disk is full
235 chomp($cwd) if defined $cwd;
239 # Since some ports may predefine cwd internally (e.g., NT)
240 # we take care not to override an existing definition for cwd().
242 unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
243 # The pwd command is not available in some chroot(2)'ed environments
244 my $sep = $Config::Config{path_sep} || ':';
245 my $os = $^O; # Protect $^O from tainting
248 # Try again to find a pwd, this time searching the whole PATH.
249 if (defined $ENV{PATH} and $os ne 'MSWin32') { # no pwd on Windows
250 my @candidates = split($sep, $ENV{PATH});
251 while (!$found_pwd_cmd and @candidates) {
252 my $candidate = shift @candidates;
253 $found_pwd_cmd = 1 if -x "$candidate/pwd";
257 # MacOS has some special magic to make `pwd` work.
258 if( $os eq 'MacOS' || $found_pwd_cmd )
260 *cwd = \&_backtick_pwd;
267 if ($^O eq 'cygwin') {
268 # We need to make sure cwd() is called with no args, because it's
269 # got an arg-less prototype and will die if args are present.
271 my $orig_cwd = \&cwd;
272 *cwd = sub { &$orig_cwd() }
276 # set a reasonable (and very safe) default for fastgetcwd, in case it
277 # isn't redefined later (20001212 rspier)
280 # A non-XS version of getcwd() - also used to bootstrap the perl build
281 # process, when miniperl is running and no XS loading happens.
289 # Usage: $cwd = &fastcwd;
291 # This is a faster version of getcwd. It's also more dangerous because
292 # you might chdir out of a directory that you can't chdir back into.
295 my($odev, $oino, $cdev, $cino, $tdev, $tino);
299 my($orig_cdev, $orig_cino) = stat('.');
300 ($cdev, $cino) = ($orig_cdev, $orig_cino);
303 ($odev, $oino) = ($cdev, $cino);
304 CORE::chdir('..') || return undef;
305 ($cdev, $cino) = stat('.');
306 last if $odev == $cdev && $oino == $cino;
307 opendir(DIR, '.') || return undef;
309 $direntry = readdir(DIR);
310 last unless defined $direntry;
311 next if $direntry eq '.';
312 next if $direntry eq '..';
314 ($tdev, $tino) = lstat($direntry);
315 last unless $tdev != $odev || $tino != $oino;
318 return undef unless defined $direntry; # should never happen
319 unshift(@path, $direntry);
321 $path = '/' . join('/', @path);
322 if ($^O eq 'apollo') { $path = "/".$path; }
323 # At this point $path may be tainted (if tainting) and chdir would fail.
324 # Untaint it then check that we landed where we started.
325 $path =~ /^(.*)\z/s # untaint
326 && CORE::chdir($1) or return undef;
327 ($cdev, $cino) = stat('.');
328 die "Unstable directory path, current directory changed unexpectedly"
329 if $cdev != $orig_cdev || $cino != $orig_cino;
332 if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }
335 # Keeps track of current working directory in PWD environment var
343 if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
344 my($dd,$di) = stat('.');
345 my($pd,$pi) = stat($ENV{'PWD'});
346 if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
352 $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
355 # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
356 if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
357 my($pd,$pi) = stat($2);
358 my($dd,$di) = stat($1);
359 if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
367 my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir)
368 if ($^O eq "cygwin") {
369 $newdir =~ s|\A///+|//|;
370 $newdir =~ s|(?<=[^/])//+|/|g;
372 elsif ($^O ne 'MSWin32') {
373 $newdir =~ s|///*|/|g;
375 chdir_init() unless $chdir_init;
377 if ($^O eq 'MSWin32') {
378 # get the full path name *before* the chdir()
379 $newpwd = Win32::GetFullPathName($newdir);
382 return 0 unless CORE::chdir $newdir;
385 return $ENV{'PWD'} = $ENV{'DEFAULT'}
387 elsif ($^O eq 'MacOS') {
388 return $ENV{'PWD'} = cwd();
390 elsif ($^O eq 'MSWin32') {
391 $ENV{'PWD'} = $newpwd;
395 if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in
397 } elsif ($newdir =~ m#^/#s) {
398 $ENV{'PWD'} = $newdir;
400 my @curdir = split(m#/#,$ENV{'PWD'});
401 @curdir = ('') unless @curdir;
403 foreach $component (split(m#/#, $newdir)) {
404 next if $component eq '.';
405 pop(@curdir),next if $component eq '..';
406 push(@curdir,$component);
408 $ENV{'PWD'} = join('/',@curdir) || '/';
416 my $start = @_ ? shift : '.';
417 my($dotdots, $cwd, @pst, @cst, $dir, @tst);
419 unless (@cst = stat( $start ))
421 _carp("stat($start): $!");
426 # Make sure we can be invoked on plain files, not just directories.
427 # NOTE that this routine assumes that '/' is the only directory separator.
429 my ($dir, $file) = $start =~ m{^(.*)/(.+)$}
430 or return cwd() . '/' . $start;
432 # Can't use "-l _" here, because the previous stat was a stat(), not an lstat().
434 my $link_target = readlink($start);
435 die "Can't resolve link $start: $!" unless defined $link_target;
438 $link_target = $dir . '/' . $link_target
439 unless File::Spec->file_name_is_absolute($link_target);
441 return abs_path($link_target);
444 return $dir ? abs_path($dir) . "/$file" : "/$file";
454 unless (opendir(PARENT, $dotdots))
456 # probably a permissions issue. Try the native command.
458 return File::Spec->rel2abs( $start, _backtick_pwd() );
460 unless (@cst = stat($dotdots))
462 _carp("stat($dotdots): $!");
466 if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
474 unless (defined ($dir = readdir(PARENT)))
476 _carp("readdir($dotdots): $!");
480 $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
482 while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
485 $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
487 } while (defined $dir);
488 chop($cwd) unless $cwd eq '/'; # drop the trailing /
495 local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
498 my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
500 # Detaint else we'll explode in taint mode. This is safe because
501 # we're not doing anything dangerous with it.
502 ($path) = $path =~ /(.*)/s;
503 ($cwd) = $cwd =~ /(.*)/s;
506 _croak("$path: No such file or directory");
510 # Make sure we can be invoked on plain files, not just directories.
512 my ($vol, $dir, $file) = File::Spec->splitpath($path);
513 return File::Spec->catfile($cwd, $path) unless length $dir;
516 my $link_target = readlink($path);
517 die "Can't resolve link $path: $!" unless defined $link_target;
519 $link_target = File::Spec->catpath($vol, $dir, $link_target)
520 unless File::Spec->file_name_is_absolute($link_target);
522 return fast_abs_path($link_target);
525 return $dir eq File::Spec->rootdir
526 ? File::Spec->catpath($vol, $dir, $file)
527 : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;
530 if (!CORE::chdir($path)) {
531 _croak("Cannot chdir to $path: $!");
533 my $realpath = getcwd();
534 if (! ((-d $cwd) && (CORE::chdir($cwd)))) {
535 _croak("Cannot chdir back to $cwd: $!");
540 # added function alias to follow principle of least surprise
541 # based on previous aliasing. --tchrist 27-Jan-00
542 *fast_realpath = \&fast_abs_path;
545 # --- PORTING SECTION ---
547 # VMS: $ENV{'DEFAULT'} points to default directory at all times
548 # 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu
549 # Note: Use of Cwd::chdir() causes the logical name PWD to be defined
550 # in the process logical name table as the default device and directory
551 # seen by Perl. This may not be the same as the default device
552 # and directory seen by DCL after Perl exits, since the effects
553 # the CRTL chdir() function persist only until Perl exits.
556 return $ENV{'DEFAULT'};
560 return $ENV{'DEFAULT'} unless @_;
564 my $unix_rpt = _vms_unix_rpt;
566 if (defined &VMS::Filespec::vmsrealpath) {
570 $path_unix = 1 if ($path =~ m#(?<=\^)/#);
571 $path_unix = 1 if ($path =~ /^\.\.?$/);
572 $path_vms = 1 if ($path =~ m#[\[<\]]#);
573 $path_vms = 1 if ($path =~ /^--?$/);
575 my $unix_mode = $path_unix;
577 # In case of a tie, the Unix report mode decides.
578 if ($path_vms == $path_unix) {
579 $unix_mode = $unix_rpt;
581 $unix_mode = 0 if $path_vms;
587 return VMS::Filespec::unixrealpath($path);
592 my $new_path = VMS::Filespec::vmsrealpath($path);
594 # Perl expects directories to be in directory format
595 $new_path = VMS::Filespec::pathify($new_path) if -d $path;
599 # Fallback to older algorithm if correct ones are not
603 my $link_target = readlink($path);
604 die "Can't resolve link $path: $!" unless defined $link_target;
606 return _vms_abs_path($link_target);
609 # may need to turn foo.dir into [.foo]
610 my $pathified = VMS::Filespec::pathify($path);
611 $path = $pathified if defined $pathified;
613 return VMS::Filespec::rmsexpand($path);
617 my $pwd = `cmd /c cd`;
624 sub _win32_cwd_simple {
634 $pwd = Win32::GetCwd();
640 *_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_win32_cwd_simple;
644 if (!defined &Dos::GetCwd) {
645 chomp($pwd = `command /c cd`);
648 $pwd = Dos::GetCwd();
655 local $ENV{PATH} = '';
656 local $ENV{CDPATH} = '';
657 local $ENV{ENV} = '';
658 my $pwd = `/usr/bin/fullpath -t`;
665 local $ENV{PATH} = '';
666 local $ENV{CDPATH} = '';
667 local $ENV{ENV} = '';
668 my $path = @_ ? shift : '.';
671 defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or
672 die "Can't open /usr/bin/fullpath: $!";
673 my $realpath = <REALPATH>;
680 return $ENV{'PWD'} = EPOC::getcwd();
684 # Now that all the base-level functions are set up, alias the
685 # user-level functions to the right places
687 if (exists $METHOD_MAP{$^O}) {
688 my $map = $METHOD_MAP{$^O};
689 foreach my $name (keys %$map) {
690 local $^W = 0; # assignments trigger 'subroutine redefined' warning
692 *{$name} = \&{$map->{$name}};
696 # In case the XS version doesn't load.
697 *abs_path = \&_perl_abs_path unless defined &abs_path;
698 *getcwd = \&_perl_getcwd unless defined &getcwd;
700 # added function alias for those of us more
701 # used to the libc function. --tchrist 27-Jan-00
702 *realpath = \&abs_path;
709 Cwd - get pathname of current working directory
717 my $abs_path = abs_path($file);
721 This module provides functions for determining the pathname of the
722 current working directory. It is recommended that getcwd (or another
723 *cwd() function) be used in I<all> code to ensure portability.
725 By default, it exports the functions cwd(), getcwd(), fastcwd(), and
726 fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
729 =head2 getcwd and friends
731 Each of these functions are called without arguments and return the
732 absolute path of the current working directory.
740 Returns the current working directory.
742 Exposes the POSIX function getcwd(3) or re-implements it if it's not
749 The cwd() is the most natural form for the current architecture. For
750 most systems it is identical to `pwd` (but without the trailing line
757 A more dangerous version of getcwd(), but potentially faster.
759 It might conceivably chdir() you out of a directory that it can't
760 chdir() you back into. If fastcwd encounters a problem it will return
761 undef but will probably leave you in a different directory. For a
762 measure of extra security, if everything appears to have worked, the
763 fastcwd() function will check that it leaves you in the same directory
764 that it started in. If it has changed it will C<die> with the message
765 "Unstable directory path, current directory changed
766 unexpectedly". That should never happen.
770 my $cwd = fastgetcwd();
772 The fastgetcwd() function is provided as a synonym for cwd().
777 my $cwd = getdcwd('C:');
779 The getdcwd() function is also provided on Win32 to get the current working
780 directory on the specified drive, since Windows maintains a separate current
781 working directory for each drive. If no drive is specified then the current
784 This function simply calls the Microsoft C library _getdcwd() function.
789 =head2 abs_path and friends
791 These functions are exported only on request. They each take a single
792 argument and return the absolute pathname for it. If no argument is
793 given they'll use the current working directory.
799 my $abs_path = abs_path($file);
801 Uses the same algorithm as getcwd(). Symbolic links and relative-path
802 components ("." and "..") are resolved to return the canonical
803 pathname, just like realpath(3).
807 my $abs_path = realpath($file);
809 A synonym for abs_path().
813 my $abs_path = fast_abs_path($file);
815 A more dangerous, but potentially faster version of abs_path.
821 If you ask to override your chdir() built-in function,
825 then your PWD environment variable will be kept up to date. Note that
826 it will only be kept up to date if all packages which use chdir import
836 Since the path separators are different on some operating systems ('/'
837 on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
838 modules wherever portability is a concern.
842 Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
843 functions are all aliases for the C<cwd()> function, which, on Mac OS,
844 calls `pwd`. Likewise, the C<abs_path()> function is an alias for
851 Originally by the perl5-porters.
853 Maintained by Ken Williams <KWILLIAMS@cpan.org>
857 Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
859 This program is free software; you can redistribute it and/or modify
860 it under the same terms as Perl itself.
862 Portions of the C code in this library are copyright (c) 1994 by the
863 Regents of the University of California. All rights reserved. The
864 license on this code is compatible with the licensing of the rest of
865 the distribution - please see the source code in F<Cwd.xs> for the