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__}; require VMS::Feature; }) {
49 # Need to look up the UNIX report mode. This may become a dynamic mode
53 if ($use_vms_feature) {
54 $unix_rpt = VMS::Feature::current("filename_unix_report");
56 my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
57 $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
62 # Need to look up the EFS character set mode. This may become a dynamic
66 if ($use_vms_feature) {
67 $efs = VMS::Feature::current("efs_charset");
69 my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
70 $efs = $env_efs =~ /^[ET1]/i;
76 # If loading the XS stuff doesn't work, we can fall back to pure perl
77 if(! defined &getcwd && defined &DynaLoader::boot_DynaLoader) {
78 eval {#eval is questionable since we are handling potential errors like
79 #"Cwd object version 3.48 does not match bootstrap parameter 3.50
80 #at lib/DynaLoader.pm line 216." by having this eval
83 XSLoader::load( __PACKAGE__, $xs_version);
86 push @ISA, 'DynaLoader';
87 __PACKAGE__->bootstrap( $xs_version );
92 # Big nasty table of function aliases
99 fastcwd => '_vms_cwd',
100 fastgetcwd => '_vms_cwd',
101 abs_path => '_vms_abs_path',
102 fast_abs_path => '_vms_abs_path',
107 # We assume that &_NT_cwd is defined as an XSUB or in the core.
110 fastcwd => '_NT_cwd',
111 fastgetcwd => '_NT_cwd',
112 abs_path => 'fast_abs_path',
113 realpath => 'fast_abs_path',
119 getcwd => '_dos_cwd',
120 fastgetcwd => '_dos_cwd',
121 fastcwd => '_dos_cwd',
122 abs_path => 'fast_abs_path',
125 # QNX4. QNX6 has a $os of 'nto'.
129 getcwd => '_qnx_cwd',
130 fastgetcwd => '_qnx_cwd',
131 fastcwd => '_qnx_cwd',
132 abs_path => '_qnx_abs_path',
133 fast_abs_path => '_qnx_abs_path',
141 abs_path => 'fast_abs_path',
142 realpath => 'fast_abs_path',
148 getcwd => '_epoc_cwd',
149 fastgetcwd => '_epoc_cwd',
150 fastcwd => '_epoc_cwd',
151 abs_path => 'fast_abs_path',
159 abs_path => 'fast_abs_path',
163 $METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
166 # Find the pwd command in the expected locations. We assume these
167 # are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
168 # so everything works under taint mode.
170 if($^O ne 'MSWin32') {
171 foreach my $try ('/bin/pwd',
173 '/QOpenSys/bin/pwd', # OS/400 PASE.
182 # Android has a built-in pwd. Using $pwd_cmd will DTRT if
183 # this perl was compiled with -Dd_useshellcmds, which is the
184 # default for Android, but the block below is needed for the
185 # miniperl running on the host when cross-compiling, and
186 # potentially for native builds with -Ud_useshellcmds.
187 if ($^O =~ /android/) {
188 # If targetsh is executable, then we're either a full
189 # perl, or a miniperl for a native build.
190 if (-x $Config::Config{targetsh}) {
191 $pwd_cmd = "$Config::Config{targetsh} -c pwd"
194 my $sh = $Config::Config{sh} || (-x '/system/bin/sh' ? '/system/bin/sh' : 'sh');
195 $pwd_cmd = "$sh -c pwd"
199 my $found_pwd_cmd = defined($pwd_cmd);
201 # Isn't this wrong? _backtick_pwd() will fail if someone has
202 # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
203 # See [perl #16774]. --jhi
208 sub _carp { require Carp; Carp::carp(@_) }
209 sub _croak { require Carp; Carp::croak(@_) }
211 # The 'natural and safe form' for UNIX (pwd may be setuid root)
213 # Localize %ENV entries in a way that won't create new hash keys
214 my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV);
215 local @ENV{@localize};
217 my $cwd = `$pwd_cmd`;
218 # Belt-and-suspenders in case someone said "undef $/".
220 # `pwd` may fail e.g. if the disk is full
221 chomp($cwd) if defined $cwd;
225 # Since some ports may predefine cwd internally (e.g., NT)
226 # we take care not to override an existing definition for cwd().
228 unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
229 # The pwd command is not available in some chroot(2)'ed environments
230 my $sep = $Config::Config{path_sep} || ':';
231 my $os = $^O; # Protect $^O from tainting
234 # Try again to find a pwd, this time searching the whole PATH.
235 if (defined $ENV{PATH} and $os ne 'MSWin32') { # no pwd on Windows
236 my @candidates = split($sep, $ENV{PATH});
237 while (!$found_pwd_cmd and @candidates) {
238 my $candidate = shift @candidates;
239 $found_pwd_cmd = 1 if -x "$candidate/pwd";
243 # MacOS has some special magic to make `pwd` work.
244 if( $os eq 'MacOS' || $found_pwd_cmd )
246 *cwd = \&_backtick_pwd;
253 if ($^O eq 'cygwin') {
254 # We need to make sure cwd() is called with no args, because it's
255 # got an arg-less prototype and will die if args are present.
257 my $orig_cwd = \&cwd;
258 *cwd = sub { &$orig_cwd() }
262 # set a reasonable (and very safe) default for fastgetcwd, in case it
263 # isn't redefined later (20001212 rspier)
266 # A non-XS version of getcwd() - also used to bootstrap the perl build
267 # process, when miniperl is running and no XS loading happens.
275 # Usage: $cwd = &fastcwd;
277 # This is a faster version of getcwd. It's also more dangerous because
278 # you might chdir out of a directory that you can't chdir back into.
281 my($odev, $oino, $cdev, $cino, $tdev, $tino);
285 my($orig_cdev, $orig_cino) = stat('.');
286 ($cdev, $cino) = ($orig_cdev, $orig_cino);
289 ($odev, $oino) = ($cdev, $cino);
290 CORE::chdir('..') || return undef;
291 ($cdev, $cino) = stat('.');
292 last if $odev == $cdev && $oino == $cino;
293 opendir(DIR, '.') || return undef;
295 $direntry = readdir(DIR);
296 last unless defined $direntry;
297 next if $direntry eq '.';
298 next if $direntry eq '..';
300 ($tdev, $tino) = lstat($direntry);
301 last unless $tdev != $odev || $tino != $oino;
304 return undef unless defined $direntry; # should never happen
305 unshift(@path, $direntry);
307 $path = '/' . join('/', @path);
308 if ($^O eq 'apollo') { $path = "/".$path; }
309 # At this point $path may be tainted (if tainting) and chdir would fail.
310 # Untaint it then check that we landed where we started.
311 $path =~ /^(.*)\z/s # untaint
312 && CORE::chdir($1) or return undef;
313 ($cdev, $cino) = stat('.');
314 die "Unstable directory path, current directory changed unexpectedly"
315 if $cdev != $orig_cdev || $cino != $orig_cino;
318 if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }
321 # Keeps track of current working directory in PWD environment var
329 if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
330 my($dd,$di) = stat('.');
331 my($pd,$pi) = stat($ENV{'PWD'});
332 if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
338 $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
341 # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
342 if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
343 my($pd,$pi) = stat($2);
344 my($dd,$di) = stat($1);
345 if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
353 my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir)
354 if ($^O eq "cygwin") {
355 $newdir =~ s|\A///+|//|;
356 $newdir =~ s|(?<=[^/])//+|/|g;
358 elsif ($^O ne 'MSWin32') {
359 $newdir =~ s|///*|/|g;
361 chdir_init() unless $chdir_init;
363 if ($^O eq 'MSWin32') {
364 # get the full path name *before* the chdir()
365 $newpwd = Win32::GetFullPathName($newdir);
368 return 0 unless CORE::chdir $newdir;
371 return $ENV{'PWD'} = $ENV{'DEFAULT'}
373 elsif ($^O eq 'MacOS') {
374 return $ENV{'PWD'} = cwd();
376 elsif ($^O eq 'MSWin32') {
377 $ENV{'PWD'} = $newpwd;
381 if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in
383 } elsif ($newdir =~ m#^/#s) {
384 $ENV{'PWD'} = $newdir;
386 my @curdir = split(m#/#,$ENV{'PWD'});
387 @curdir = ('') unless @curdir;
389 foreach $component (split(m#/#, $newdir)) {
390 next if $component eq '.';
391 pop(@curdir),next if $component eq '..';
392 push(@curdir,$component);
394 $ENV{'PWD'} = join('/',@curdir) || '/';
402 my $start = @_ ? shift : '.';
403 my($dotdots, $cwd, @pst, @cst, $dir, @tst);
405 unless (@cst = stat( $start ))
407 _carp("stat($start): $!");
412 # Make sure we can be invoked on plain files, not just directories.
413 # NOTE that this routine assumes that '/' is the only directory separator.
415 my ($dir, $file) = $start =~ m{^(.*)/(.+)$}
416 or return cwd() . '/' . $start;
418 # Can't use "-l _" here, because the previous stat was a stat(), not an lstat().
420 my $link_target = readlink($start);
421 die "Can't resolve link $start: $!" unless defined $link_target;
424 $link_target = $dir . '/' . $link_target
425 unless File::Spec->file_name_is_absolute($link_target);
427 return abs_path($link_target);
430 return $dir ? abs_path($dir) . "/$file" : "/$file";
440 unless (opendir(PARENT, $dotdots))
442 # probably a permissions issue. Try the native command.
444 return File::Spec->rel2abs( $start, _backtick_pwd() );
446 unless (@cst = stat($dotdots))
448 _carp("stat($dotdots): $!");
452 if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
460 unless (defined ($dir = readdir(PARENT)))
462 _carp("readdir($dotdots): $!");
466 $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
468 while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
471 $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
473 } while (defined $dir);
474 chop($cwd) unless $cwd eq '/'; # drop the trailing /
481 local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
484 my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
486 # Detaint else we'll explode in taint mode. This is safe because
487 # we're not doing anything dangerous with it.
488 ($path) = $path =~ /(.*)/s;
489 ($cwd) = $cwd =~ /(.*)/s;
492 _croak("$path: No such file or directory");
496 # Make sure we can be invoked on plain files, not just directories.
498 my ($vol, $dir, $file) = File::Spec->splitpath($path);
499 return File::Spec->catfile($cwd, $path) unless length $dir;
502 my $link_target = readlink($path);
503 die "Can't resolve link $path: $!" unless defined $link_target;
505 $link_target = File::Spec->catpath($vol, $dir, $link_target)
506 unless File::Spec->file_name_is_absolute($link_target);
508 return fast_abs_path($link_target);
511 return $dir eq File::Spec->rootdir
512 ? File::Spec->catpath($vol, $dir, $file)
513 : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;
516 if (!CORE::chdir($path)) {
517 _croak("Cannot chdir to $path: $!");
519 my $realpath = getcwd();
520 if (! ((-d $cwd) && (CORE::chdir($cwd)))) {
521 _croak("Cannot chdir back to $cwd: $!");
526 # added function alias to follow principle of least surprise
527 # based on previous aliasing. --tchrist 27-Jan-00
528 *fast_realpath = \&fast_abs_path;
531 # --- PORTING SECTION ---
533 # VMS: $ENV{'DEFAULT'} points to default directory at all times
534 # 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu
535 # Note: Use of Cwd::chdir() causes the logical name PWD to be defined
536 # in the process logical name table as the default device and directory
537 # seen by Perl. This may not be the same as the default device
538 # and directory seen by DCL after Perl exits, since the effects
539 # the CRTL chdir() function persist only until Perl exits.
542 return $ENV{'DEFAULT'};
546 return $ENV{'DEFAULT'} unless @_;
550 my $unix_rpt = _vms_unix_rpt;
552 if (defined &VMS::Filespec::vmsrealpath) {
556 $path_unix = 1 if ($path =~ m#(?<=\^)/#);
557 $path_unix = 1 if ($path =~ /^\.\.?$/);
558 $path_vms = 1 if ($path =~ m#[\[<\]]#);
559 $path_vms = 1 if ($path =~ /^--?$/);
561 my $unix_mode = $path_unix;
563 # In case of a tie, the Unix report mode decides.
564 if ($path_vms == $path_unix) {
565 $unix_mode = $unix_rpt;
567 $unix_mode = 0 if $path_vms;
573 return VMS::Filespec::unixrealpath($path);
578 my $new_path = VMS::Filespec::vmsrealpath($path);
580 # Perl expects directories to be in directory format
581 $new_path = VMS::Filespec::pathify($new_path) if -d $path;
585 # Fallback to older algorithm if correct ones are not
589 my $link_target = readlink($path);
590 die "Can't resolve link $path: $!" unless defined $link_target;
592 return _vms_abs_path($link_target);
595 # may need to turn foo.dir into [.foo]
596 my $pathified = VMS::Filespec::pathify($path);
597 $path = $pathified if defined $pathified;
599 return VMS::Filespec::rmsexpand($path);
603 $ENV{'PWD'} = `cmd /c cd`;
605 $ENV{'PWD'} =~ s:\\:/:g ;
609 sub _win32_cwd_simple {
612 $ENV{'PWD'} =~ s:\\:/:g ;
617 # Need to avoid taking any sort of reference to the typeglob or the code in
618 # the optree, so that this tests the runtime state of things, as the
619 # ExtUtils::MakeMaker tests for "miniperl" need to be able to fake things at
620 # runtime by deleting the subroutine. *foo{THING} syntax on a symbol table
621 # lookup avoids needing a string eval, which has been reported to cause
622 # problems (for reasons that we haven't been able to get to the bottom of -
623 # rt.cpan.org #56225)
624 if (*{$DynaLoader::{boot_DynaLoader}}{CODE}) {
625 $ENV{'PWD'} = Win32::GetCwd();
628 chomp($ENV{'PWD'} = `cd`);
630 $ENV{'PWD'} =~ s:\\:/:g ;
634 *_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_win32_cwd_simple;
637 if (!defined &Dos::GetCwd) {
638 $ENV{'PWD'} = `command /c cd`;
640 $ENV{'PWD'} =~ s:\\:/:g ;
642 $ENV{'PWD'} = Dos::GetCwd();
648 local $ENV{PATH} = '';
649 local $ENV{CDPATH} = '';
650 local $ENV{ENV} = '';
651 $ENV{'PWD'} = `/usr/bin/fullpath -t`;
657 local $ENV{PATH} = '';
658 local $ENV{CDPATH} = '';
659 local $ENV{ENV} = '';
660 my $path = @_ ? shift : '.';
663 defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or
664 die "Can't open /usr/bin/fullpath: $!";
665 my $realpath = <REALPATH>;
672 $ENV{'PWD'} = EPOC::getcwd();
677 # Now that all the base-level functions are set up, alias the
678 # user-level functions to the right places
680 if (exists $METHOD_MAP{$^O}) {
681 my $map = $METHOD_MAP{$^O};
682 foreach my $name (keys %$map) {
683 local $^W = 0; # assignments trigger 'subroutine redefined' warning
685 *{$name} = \&{$map->{$name}};
689 # In case the XS version doesn't load.
690 *abs_path = \&_perl_abs_path unless defined &abs_path;
691 *getcwd = \&_perl_getcwd unless defined &getcwd;
693 # added function alias for those of us more
694 # used to the libc function. --tchrist 27-Jan-00
695 *realpath = \&abs_path;
702 Cwd - get pathname of current working directory
710 my $abs_path = abs_path($file);
714 This module provides functions for determining the pathname of the
715 current working directory. It is recommended that getcwd (or another
716 *cwd() function) be used in I<all> code to ensure portability.
718 By default, it exports the functions cwd(), getcwd(), fastcwd(), and
719 fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
722 =head2 getcwd and friends
724 Each of these functions are called without arguments and return the
725 absolute path of the current working directory.
733 Returns the current working directory.
735 Exposes the POSIX function getcwd(3) or re-implements it if it's not
742 The cwd() is the most natural form for the current architecture. For
743 most systems it is identical to `pwd` (but without the trailing line
750 A more dangerous version of getcwd(), but potentially faster.
752 It might conceivably chdir() you out of a directory that it can't
753 chdir() you back into. If fastcwd encounters a problem it will return
754 undef but will probably leave you in a different directory. For a
755 measure of extra security, if everything appears to have worked, the
756 fastcwd() function will check that it leaves you in the same directory
757 that it started in. If it has changed it will C<die> with the message
758 "Unstable directory path, current directory changed
759 unexpectedly". That should never happen.
763 my $cwd = fastgetcwd();
765 The fastgetcwd() function is provided as a synonym for cwd().
770 my $cwd = getdcwd('C:');
772 The getdcwd() function is also provided on Win32 to get the current working
773 directory on the specified drive, since Windows maintains a separate current
774 working directory for each drive. If no drive is specified then the current
777 This function simply calls the Microsoft C library _getdcwd() function.
782 =head2 abs_path and friends
784 These functions are exported only on request. They each take a single
785 argument and return the absolute pathname for it. If no argument is
786 given they'll use the current working directory.
792 my $abs_path = abs_path($file);
794 Uses the same algorithm as getcwd(). Symbolic links and relative-path
795 components ("." and "..") are resolved to return the canonical
796 pathname, just like realpath(3).
800 my $abs_path = realpath($file);
802 A synonym for abs_path().
806 my $abs_path = fast_abs_path($file);
808 A more dangerous, but potentially faster version of abs_path.
814 If you ask to override your chdir() built-in function,
818 then your PWD environment variable will be kept up to date. Note that
819 it will only be kept up to date if all packages which use chdir import
829 Since the path separators are different on some operating systems ('/'
830 on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
831 modules wherever portability is a concern.
835 Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
836 functions are all aliases for the C<cwd()> function, which, on Mac OS,
837 calls `pwd`. Likewise, the C<abs_path()> function is an alias for
844 Originally by the perl5-porters.
846 Maintained by Ken Williams <KWILLIAMS@cpan.org>
850 Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
852 This program is free software; you can redistribute it and/or modify
853 it under the same terms as Perl itself.
855 Portions of the C code in this library are copyright (c) 1994 by the
856 Regents of the University of California. All rights reserved. The
857 license on this code is compatible with the licensing of the rest of
858 the distribution - please see the source code in F<Cwd.xs> for the