Darwin is not Windows.
[p5sagit/p5-mst-13.2.git] / lib / Cwd.pm
index d4abc9a..840e2a6 100644 (file)
@@ -89,7 +89,15 @@ sub _backtick_pwd {
 # Since some ports may predefine cwd internally (e.g., NT)
 # we take care not to override an existing definition for cwd().
 
-*cwd = \&_backtick_pwd unless defined &cwd;
+unless(defined &cwd) {
+    # The pwd command is not available in some chroot(2)'ed environments
+    if(grep { -x "$_/pwd" } split(':', $ENV{PATH})) {
+       *cwd = \&_backtick_pwd;
+    }
+    else {
+       *cwd = \&getcwd;
+    }
+}
 
 
 # By Brandon S. Allbery
@@ -156,7 +164,7 @@ sub fastcwd {
 my $chdir_init = 0;
 
 sub chdir_init {
-    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos') {
+    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
        my($dd,$di) = stat('.');
        my($pd,$pi) = stat($ENV{'PWD'});
        if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
@@ -164,10 +172,12 @@ sub chdir_init {
        }
     }
     else {
-       $ENV{'PWD'} = cwd();
+       my $wd = cwd();
+       $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
+       $ENV{'PWD'} = $wd;
     }
     # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
-    if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
+    if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
        my($pd,$pi) = stat($2);
        my($dd,$di) = stat($1);
        if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
@@ -178,11 +188,17 @@ sub chdir_init {
 }
 
 sub chdir {
-    my $newdir = shift || '';  # allow for no arg (chdir to HOME dir)
-    $newdir =~ s|///*|/|g;
+    my $newdir = @_ ? shift : '';      # allow for no arg (chdir to HOME dir)
+    $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
     chdir_init() unless $chdir_init;
     return 0 unless CORE::chdir $newdir;
-    if ($^O eq 'VMS') { return $ENV{'PWD'} = $ENV{'DEFAULT'} }
+    if ($^O eq 'VMS') {
+       return $ENV{'PWD'} = $ENV{'DEFAULT'}
+    }
+    elsif ($^O eq 'MSWin32') {
+       $ENV{'PWD'} = Win32::GetFullPathName($newdir);
+       return 1;
+    }
 
     if ($newdir =~ m#^/#s) {
        $ENV{'PWD'} = $newdir;
@@ -263,7 +279,7 @@ sub abs_path
 
 sub fast_abs_path {
     my $cwd = getcwd();
-    my $path = shift || '.';
+    my $path = @_ ? shift : '.';
     CORE::chdir($path) || croak "Cannot chdir to $path:$!";
     my $realpath = getcwd();
     CORE::chdir($cwd)  || croak "Cannot chdir back to $cwd:$!";
@@ -332,12 +348,17 @@ sub _qnx_cwd {
 }
 
 sub _qnx_abs_path {
-    my $path = shift || '.';
+    my $path = @_ ? shift : '.';
     my $realpath=`/usr/bin/fullpath -t $path`;
     chop $realpath;
     return $realpath;
 }
 
+sub _epoc_cwd {
+    $ENV{'PWD'} = EPOC::getcwd();
+    return $ENV{'PWD'};
+}
+
 {
     no warnings;       # assignments trigger 'subroutine redefined' warning
 
@@ -386,6 +407,13 @@ sub _qnx_abs_path {
         *fastcwd       = \&cwd;
         *abs_path      = \&fast_abs_path;
     }
+    elsif ($^O eq 'epoc') {
+        *cwd            = \&_epoc_cwd;
+        *getcwd                = \&_epoc_cwd;
+        *fastgetcwd    = \&_epoc_cwd;
+        *fastcwd       = \&_epoc_cwd;
+        *abs_path      = \&fast_abs_path;
+    }
 }
 
 # package main; eval join('',<DATA>) || die $@;        # quick test