Remove a spurious undefined warning when using getopts.pl with -w.
[p5sagit/p5-mst-13.2.git] / lib / Cwd.pm
CommitLineData
a0d0e21e 1package Cwd;
a0d0e21e 2
f06db76b 3=head1 NAME
4
902bacac 5Cwd - get pathname of current working directory
f06db76b 6
7=head1 SYNOPSIS
8
4633a7c4 9 use Cwd;
04929354 10 my $dir = getcwd;
4633a7c4 11
04929354 12 use Cwd 'abs_path';
13 my $abs_path = abs_path($file);
f06db76b 14
04929354 15=head1 DESCRIPTION
902bacac 16
04929354 17This module provides functions for determining the pathname of the
18current working directory. It is recommended that getcwd (or another
19*cwd() function) be used in I<all> code to ensure portability.
f06db76b 20
04929354 21By default, it exports the functions cwd(), getcwd(), fastcwd(), and
09122b95 22fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace.
f06db76b 23
20408e3c 24
04929354 25=head2 getcwd and friends
20408e3c 26
04929354 27Each of these functions are called without arguments and return the
28absolute path of the current working directory.
f06db76b 29
04929354 30=over 4
31
32=item getcwd
33
34 my $cwd = getcwd();
35
36Returns the current working directory.
37
38Re-implements the getcwd(3) (or getwd(3)) functions in Perl.
39
40=item cwd
41
42 my $cwd = cwd();
43
44The cwd() is the most natural form for the current architecture. For
45most systems it is identical to `pwd` (but without the trailing line
46terminator).
47
04929354 48=item fastcwd
49
50 my $cwd = fastcwd();
51
52A more dangerous version of getcwd(), but potentially faster.
53
54It might conceivably chdir() you out of a directory that it can't
55chdir() you back into. If fastcwd encounters a problem it will return
56undef but will probably leave you in a different directory. For a
57measure of extra security, if everything appears to have worked, the
58fastcwd() function will check that it leaves you in the same directory
59that it started in. If it has changed it will C<die> with the message
60"Unstable directory path, current directory changed
61unexpectedly". That should never happen.
62
63=item fastgetcwd
64
65 my $cwd = fastgetcwd();
f06db76b 66
902bacac 67The fastgetcwd() function is provided as a synonym for cwd().
fb73857a 68
09122b95 69=item getdcwd
70
71 my $cwd = getdcwd();
72 my $cwd = getdcwd('C:');
73
74The getdcwd() function is also provided on Win32 to get the current working
75directory on the specified drive, since Windows maintains a separate current
76working directory for each drive. If no drive is specified then the current
77drive is assumed.
78
79This function simply calls the Microsoft C library _getdcwd() function.
80
04929354 81=back
82
902bacac 83
04929354 84=head2 abs_path and friends
85
86These functions are exported only on request. They each take a single
3ee63918 87argument and return the absolute pathname for it. If no argument is
88given they'll use the current working directory.
04929354 89
90=over 4
91
92=item abs_path
93
94 my $abs_path = abs_path($file);
95
96Uses the same algorithm as getcwd(). Symbolic links and relative-path
97components ("." and "..") are resolved to return the canonical
98pathname, just like realpath(3).
99
100=item realpath
101
102 my $abs_path = realpath($file);
103
104A synonym for abs_path().
105
106=item fast_abs_path
107
510179aa 108 my $abs_path = fast_abs_path($file);
04929354 109
110A more dangerous, but potentially faster version of abs_path.
111
112=back
113
114=head2 $ENV{PWD}
115
116If you ask to override your chdir() built-in function,
117
118 use Cwd qw(chdir);
119
120then your PWD environment variable will be kept up to date. Note that
121it will only be kept up to date if all packages which use chdir import
122it from Cwd.
4633a7c4 123
4633a7c4 124
4d6b4052 125=head1 NOTES
126
127=over 4
128
129=item *
130
04929354 131Since the path seperators are different on some operating systems ('/'
132on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec
133modules wherever portability is a concern.
134
04929354 135=item *
4d6b4052 136
137Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()>
138functions are all aliases for the C<cwd()> function, which, on Mac OS,
139calls `pwd`. Likewise, the C<abs_path()> function is an alias for
140C<fast_abs_path()>.
141
142=back
143
02cc4877 144=head1 AUTHOR
145
146Originally by the perl5-porters.
147
78321866 148Maintained by Ken Williams <KWILLIAMS@cpan.org>
02cc4877 149
99f36a73 150=head1 COPYRIGHT
151
152Copyright (c) 2004 by the Perl 5 Porters. All rights reserved.
153
154This program is free software; you can redistribute it and/or modify
155it under the same terms as Perl itself.
156
157Portions of the C code in this library are copyright (c) 1994 by the
158Regents of the University of California. All rights reserved. The
159license on this code is compatible with the licensing of the rest of
160the distribution - please see the source code in F<Cwd.xs> for the
161details.
162
04929354 163=head1 SEE ALSO
164
165L<File::chdir>
166
f06db76b 167=cut
168
b060a406 169use strict;
a9939470 170use Exporter;
99f36a73 171use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
172
8e6a5f51 173$VERSION = '3.04_01';
96e4d5b1 174
a9939470 175@ISA = qw/ Exporter /;
176@EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
09122b95 177push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32';
a9939470 178@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
a0d0e21e 179
f5f423e4 180# sys_cwd may keep the builtin command
181
182# All the functionality of this module may provided by builtins,
183# there is no sense to process the rest of the file.
184# The best choice may be to have this in BEGIN, but how to return from BEGIN?
185
a9939470 186if ($^O eq 'os2') {
f5f423e4 187 local $^W = 0;
a9939470 188
189 *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
190 *getcwd = \&cwd;
191 *fastgetcwd = \&cwd;
192 *fastcwd = \&cwd;
193
194 *fast_abs_path = \&sys_abspath if defined &sys_abspath;
195 *abs_path = \&fast_abs_path;
196 *realpath = \&fast_abs_path;
197 *fast_realpath = \&fast_abs_path;
198
f5f423e4 199 return 1;
200}
201
f22d8e4b 202eval {
99f36a73 203if ( $] >= 5.006 ) {
204 require XSLoader;
205 XSLoader::load( __PACKAGE__, $VERSION );
206} else {
207 require DynaLoader;
208 push @ISA, 'DynaLoader';
209 __PACKAGE__->bootstrap( $VERSION );
210}
f22d8e4b 211};
4633a7c4 212
99f36a73 213# Must be after the DynaLoader stuff:
214$VERSION = eval $VERSION;
215
09122b95 216# Big nasty table of function aliases
217my %METHOD_MAP =
218 (
219 VMS =>
220 {
221 cwd => '_vms_cwd',
222 getcwd => '_vms_cwd',
223 fastcwd => '_vms_cwd',
224 fastgetcwd => '_vms_cwd',
225 abs_path => '_vms_abs_path',
226 fast_abs_path => '_vms_abs_path',
227 },
228
229 MSWin32 =>
230 {
231 # We assume that &_NT_cwd is defined as an XSUB or in the core.
232 cwd => '_NT_cwd',
233 getcwd => '_NT_cwd',
234 fastcwd => '_NT_cwd',
235 fastgetcwd => '_NT_cwd',
236 abs_path => 'fast_abs_path',
237 realpath => 'fast_abs_path',
238 },
239
240 dos =>
241 {
242 cwd => '_dos_cwd',
243 getcwd => '_dos_cwd',
244 fastgetcwd => '_dos_cwd',
245 fastcwd => '_dos_cwd',
246 abs_path => 'fast_abs_path',
247 },
248
249 qnx =>
250 {
251 cwd => '_qnx_cwd',
252 getcwd => '_qnx_cwd',
253 fastgetcwd => '_qnx_cwd',
254 fastcwd => '_qnx_cwd',
255 abs_path => '_qnx_abs_path',
256 fast_abs_path => '_qnx_abs_path',
257 },
258
259 cygwin =>
260 {
261 getcwd => 'cwd',
262 fastgetcwd => 'cwd',
263 fastcwd => 'cwd',
264 abs_path => 'fast_abs_path',
265 realpath => 'fast_abs_path',
266 },
267
268 epoc =>
269 {
270 cwd => '_epoc_cwd',
271 getcwd => '_epoc_cwd',
272 fastgetcwd => '_epoc_cwd',
273 fastcwd => '_epoc_cwd',
274 abs_path => 'fast_abs_path',
275 },
276
277 MacOS =>
278 {
279 getcwd => 'cwd',
280 fastgetcwd => 'cwd',
281 fastcwd => 'cwd',
282 abs_path => 'fast_abs_path',
283 },
284 );
285
286$METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
287$METHOD_MAP{nto} = $METHOD_MAP{qnx};
288
96e4d5b1 289
3547aa9a 290# Find the pwd command in the expected locations. We assume these
291# are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
292# so everything works under taint mode.
293my $pwd_cmd;
889f7a4f 294foreach my $try ('/bin/pwd',
295 '/usr/bin/pwd',
296 '/QOpenSys/bin/pwd', # OS/400 PASE.
297 ) {
298
3547aa9a 299 if( -x $try ) {
300 $pwd_cmd = $try;
301 last;
302 }
303}
522b859a 304unless ($pwd_cmd) {
889f7a4f 305 # Isn't this wrong? _backtick_pwd() will fail if somenone has
306 # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
307 # See [perl #16774]. --jhi
308 $pwd_cmd = 'pwd';
522b859a 309}
3547aa9a 310
a9939470 311# Lazy-load Carp
312sub _carp { require Carp; Carp::carp(@_) }
313sub _croak { require Carp; Carp::croak(@_) }
314
3547aa9a 315# The 'natural and safe form' for UNIX (pwd may be setuid root)
8b88ae92 316sub _backtick_pwd {
db281859 317 local @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)};
3547aa9a 318 my $cwd = `$pwd_cmd`;
ac3b20cb 319 # Belt-and-suspenders in case someone said "undef $/".
5cf6da5f 320 local $/ = "\n";
ac3b20cb 321 # `pwd` may fail e.g. if the disk is full
7e03f963 322 chomp($cwd) if defined $cwd;
4633a7c4 323 $cwd;
8b88ae92 324}
4633a7c4 325
326# Since some ports may predefine cwd internally (e.g., NT)
327# we take care not to override an existing definition for cwd().
328
09122b95 329unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) {
ea54c8bd 330 # The pwd command is not available in some chroot(2)'ed environments
09122b95 331 my $sep = $Config::Config{path_sep} || ':';
332 if( $^O eq 'MacOS' || (defined $ENV{PATH} &&
99f36a73 333 $^O ne 'MSWin32' && # no pwd on Windows
09122b95 334 grep { -x "$_/pwd" } split($sep, $ENV{PATH})) )
73b801a6 335 {
ea54c8bd 336 *cwd = \&_backtick_pwd;
337 }
338 else {
339 *cwd = \&getcwd;
340 }
341}
a0d0e21e 342
1f4f94f5 343# set a reasonable (and very safe) default for fastgetcwd, in case it
344# isn't redefined later (20001212 rspier)
345*fastgetcwd = \&cwd;
748a9306 346
a0d0e21e 347# By Brandon S. Allbery
348#
349# Usage: $cwd = getcwd();
350
351sub getcwd
352{
07569ed3 353 abs_path('.');
a0d0e21e 354}
355
a0c9c202 356
357# By John Bazik
358#
359# Usage: $cwd = &fastcwd;
360#
361# This is a faster version of getcwd. It's also more dangerous because
362# you might chdir out of a directory that you can't chdir back into.
363
99f36a73 364sub fastcwd_ {
a0c9c202 365 my($odev, $oino, $cdev, $cino, $tdev, $tino);
366 my(@path, $path);
367 local(*DIR);
368
369 my($orig_cdev, $orig_cino) = stat('.');
370 ($cdev, $cino) = ($orig_cdev, $orig_cino);
371 for (;;) {
372 my $direntry;
373 ($odev, $oino) = ($cdev, $cino);
374 CORE::chdir('..') || return undef;
375 ($cdev, $cino) = stat('.');
376 last if $odev == $cdev && $oino == $cino;
377 opendir(DIR, '.') || return undef;
378 for (;;) {
379 $direntry = readdir(DIR);
380 last unless defined $direntry;
381 next if $direntry eq '.';
382 next if $direntry eq '..';
383
384 ($tdev, $tino) = lstat($direntry);
385 last unless $tdev != $odev || $tino != $oino;
386 }
387 closedir(DIR);
388 return undef unless defined $direntry; # should never happen
389 unshift(@path, $direntry);
390 }
391 $path = '/' . join('/', @path);
392 if ($^O eq 'apollo') { $path = "/".$path; }
393 # At this point $path may be tainted (if tainting) and chdir would fail.
248785eb 394 # Untaint it then check that we landed where we started.
395 $path =~ /^(.*)\z/s # untaint
396 && CORE::chdir($1) or return undef;
a0c9c202 397 ($cdev, $cino) = stat('.');
398 die "Unstable directory path, current directory changed unexpectedly"
399 if $cdev != $orig_cdev || $cino != $orig_cino;
400 $path;
401}
99f36a73 402if (not defined &fastcwd) { *fastcwd = \&fastcwd_ }
a0c9c202 403
404
4633a7c4 405# Keeps track of current working directory in PWD environment var
a0d0e21e 406# Usage:
407# use Cwd 'chdir';
408# chdir $newdir;
409
4633a7c4 410my $chdir_init = 0;
a0d0e21e 411
4633a7c4 412sub chdir_init {
3b8e3443 413 if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
a0d0e21e 414 my($dd,$di) = stat('.');
415 my($pd,$pi) = stat($ENV{'PWD'});
416 if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
4633a7c4 417 $ENV{'PWD'} = cwd();
a0d0e21e 418 }
419 }
420 else {
3b8e3443 421 my $wd = cwd();
422 $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
423 $ENV{'PWD'} = $wd;
a0d0e21e 424 }
4633a7c4 425 # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
3b8e3443 426 if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
a0d0e21e 427 my($pd,$pi) = stat($2);
428 my($dd,$di) = stat($1);
429 if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
430 $ENV{'PWD'}="$2$3";
431 }
432 }
433 $chdir_init = 1;
434}
435
436sub chdir {
22978713 437 my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir)
3b8e3443 438 $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
a0d0e21e 439 chdir_init() unless $chdir_init;
4ffa1610 440 my $newpwd;
441 if ($^O eq 'MSWin32') {
442 # get the full path name *before* the chdir()
443 $newpwd = Win32::GetFullPathName($newdir);
444 }
445
4633a7c4 446 return 0 unless CORE::chdir $newdir;
4ffa1610 447
3b8e3443 448 if ($^O eq 'VMS') {
449 return $ENV{'PWD'} = $ENV{'DEFAULT'}
450 }
4aecb5b5 451 elsif ($^O eq 'MacOS') {
452 return $ENV{'PWD'} = cwd();
453 }
3b8e3443 454 elsif ($^O eq 'MSWin32') {
4ffa1610 455 $ENV{'PWD'} = $newpwd;
3b8e3443 456 return 1;
457 }
748a9306 458
392d8ab8 459 if ($newdir =~ m#^/#s) {
a0d0e21e 460 $ENV{'PWD'} = $newdir;
4633a7c4 461 } else {
462 my @curdir = split(m#/#,$ENV{'PWD'});
463 @curdir = ('') unless @curdir;
464 my $component;
a0d0e21e 465 foreach $component (split(m#/#, $newdir)) {
466 next if $component eq '.';
467 pop(@curdir),next if $component eq '..';
468 push(@curdir,$component);
469 }
470 $ENV{'PWD'} = join('/',@curdir) || '/';
471 }
4633a7c4 472 1;
a0d0e21e 473}
474
a0c9c202 475
99f36a73 476sub _perl_abs_path
a0c9c202 477{
478 my $start = @_ ? shift : '.';
479 my($dotdots, $cwd, @pst, @cst, $dir, @tst);
480
481 unless (@cst = stat( $start ))
482 {
a9939470 483 _carp("stat($start): $!");
a0c9c202 484 return '';
485 }
09122b95 486
487 unless (-d _) {
488 # Make sure we can be invoked on plain files, not just directories.
489 # NOTE that this routine assumes that '/' is the only directory separator.
490
491 my ($dir, $file) = $start =~ m{^(.*)/(.+)$}
492 or return cwd() . '/' . $start;
493
275e8705 494 # Can't use "-l _" here, because the previous stat was a stat(), not an lstat().
495 if (-l $start) {
09122b95 496 my $link_target = readlink($start);
497 die "Can't resolve link $start: $!" unless defined $link_target;
498
499 require File::Spec;
500 $link_target = $dir . '/' . $link_target
501 unless File::Spec->file_name_is_absolute($link_target);
502
503 return abs_path($link_target);
504 }
505
99f36a73 506 return $dir ? abs_path($dir) . "/$file" : "/$file";
09122b95 507 }
508
a0c9c202 509 $cwd = '';
510 $dotdots = $start;
511 do
512 {
513 $dotdots .= '/..';
514 @pst = @cst;
a25ef67d 515 local *PARENT;
a0c9c202 516 unless (opendir(PARENT, $dotdots))
517 {
a9939470 518 _carp("opendir($dotdots): $!");
a0c9c202 519 return '';
520 }
521 unless (@cst = stat($dotdots))
522 {
a9939470 523 _carp("stat($dotdots): $!");
a0c9c202 524 closedir(PARENT);
525 return '';
526 }
527 if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
528 {
529 $dir = undef;
530 }
531 else
532 {
533 do
534 {
535 unless (defined ($dir = readdir(PARENT)))
536 {
a9939470 537 _carp("readdir($dotdots): $!");
a0c9c202 538 closedir(PARENT);
539 return '';
540 }
541 $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
542 }
543 while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
544 $tst[1] != $pst[1]);
545 }
546 $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
547 closedir(PARENT);
548 } while (defined $dir);
549 chop($cwd) unless $cwd eq '/'; # drop the trailing /
550 $cwd;
551}
552
553
3ee63918 554my $Curdir;
96e4d5b1 555sub fast_abs_path {
99f36a73 556 local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
96e4d5b1 557 my $cwd = getcwd();
4d6b4052 558 require File::Spec;
3ee63918 559 my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
560
561 # Detaint else we'll explode in taint mode. This is safe because
562 # we're not doing anything dangerous with it.
563 ($path) = $path =~ /(.*)/;
564 ($cwd) = $cwd =~ /(.*)/;
565
09122b95 566 unless (-e $path) {
567 _croak("$path: No such file or directory");
568 }
569
570 unless (-d _) {
571 # Make sure we can be invoked on plain files, not just directories.
572
573 my ($vol, $dir, $file) = File::Spec->splitpath($path);
574 return File::Spec->catfile($cwd, $path) unless length $dir;
575
576 if (-l $path) {
577 my $link_target = readlink($path);
578 die "Can't resolve link $path: $!" unless defined $link_target;
579
580 $link_target = File::Spec->catpath($vol, $dir, $link_target)
581 unless File::Spec->file_name_is_absolute($link_target);
582
583 return fast_abs_path($link_target);
584 }
585
8e6a5f51 586 my $tdir = $dir;
587 $tdir =~ s!\\!/!g if $^O eq 'MSWin32';
588 return $tdir eq File::Spec->rootdir
99f36a73 589 ? File::Spec->catpath($vol, $dir, $file)
590 : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file;
09122b95 591 }
592
e2ba406b 593 if (!CORE::chdir($path)) {
a9939470 594 _croak("Cannot chdir to $path: $!");
e2ba406b 595 }
96e4d5b1 596 my $realpath = getcwd();
e2ba406b 597 if (! ((-d $cwd) && (CORE::chdir($cwd)))) {
a9939470 598 _croak("Cannot chdir back to $cwd: $!");
e2ba406b 599 }
96e4d5b1 600 $realpath;
8b88ae92 601}
602
e4c51978 603# added function alias to follow principle of least surprise
604# based on previous aliasing. --tchrist 27-Jan-00
605*fast_realpath = \&fast_abs_path;
606
4633a7c4 607
608# --- PORTING SECTION ---
609
610# VMS: $ENV{'DEFAULT'} points to default directory at all times
bd3fa61c 611# 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu
c6538b72 612# Note: Use of Cwd::chdir() causes the logical name PWD to be defined
8b88ae92 613# in the process logical name table as the default device and directory
614# seen by Perl. This may not be the same as the default device
4633a7c4 615# and directory seen by DCL after Perl exits, since the effects
616# the CRTL chdir() function persist only until Perl exits.
4633a7c4 617
618sub _vms_cwd {
96e4d5b1 619 return $ENV{'DEFAULT'};
620}
621
622sub _vms_abs_path {
623 return $ENV{'DEFAULT'} unless @_;
9d7d9729 624
625 # may need to turn foo.dir into [.foo]
96e4d5b1 626 my $path = VMS::Filespec::pathify($_[0]);
9d7d9729 627 $path = $_[0] unless defined $path;
628
96e4d5b1 629 return VMS::Filespec::rmsexpand($path);
4633a7c4 630}
68dc0745 631
4633a7c4 632sub _os2_cwd {
633 $ENV{'PWD'} = `cmd /c cd`;
39741d73 634 chomp $ENV{'PWD'};
aa6b7957 635 $ENV{'PWD'} =~ s:\\:/:g ;
4633a7c4 636 return $ENV{'PWD'};
637}
638
96e4d5b1 639sub _win32_cwd {
2d7a9237 640 $ENV{'PWD'} = Win32::GetCwd();
aa6b7957 641 $ENV{'PWD'} =~ s:\\:/:g ;
96e4d5b1 642 return $ENV{'PWD'};
643}
644
645*_NT_cwd = \&_win32_cwd if (!defined &_NT_cwd &&
2d7a9237 646 defined &Win32::GetCwd);
96e4d5b1 647
648*_NT_cwd = \&_os2_cwd unless defined &_NT_cwd;
68dc0745 649
39e571d4 650sub _dos_cwd {
651 if (!defined &Dos::GetCwd) {
652 $ENV{'PWD'} = `command /c cd`;
39741d73 653 chomp $ENV{'PWD'};
aa6b7957 654 $ENV{'PWD'} =~ s:\\:/:g ;
39e571d4 655 } else {
656 $ENV{'PWD'} = Dos::GetCwd();
657 }
55497cff 658 return $ENV{'PWD'};
659}
660
7fbf1995 661sub _qnx_cwd {
35b807ef 662 local $ENV{PATH} = '';
663 local $ENV{CDPATH} = '';
664 local $ENV{ENV} = '';
7fbf1995 665 $ENV{'PWD'} = `/usr/bin/fullpath -t`;
39741d73 666 chomp $ENV{'PWD'};
7fbf1995 667 return $ENV{'PWD'};
668}
669
670sub _qnx_abs_path {
35b807ef 671 local $ENV{PATH} = '';
672 local $ENV{CDPATH} = '';
673 local $ENV{ENV} = '';
fa921dc6 674 my $path = @_ ? shift : '.';
39741d73 675 local *REALPATH;
676
99f36a73 677 defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or
39741d73 678 die "Can't open /usr/bin/fullpath: $!";
679 my $realpath = <REALPATH>;
680 close REALPATH;
681 chomp $realpath;
7fbf1995 682 return $realpath;
683}
684
ed79a026 685sub _epoc_cwd {
686 $ENV{'PWD'} = EPOC::getcwd();
687 return $ENV{'PWD'};
688}
689
4633a7c4 690
09122b95 691# Now that all the base-level functions are set up, alias the
692# user-level functions to the right places
693
694if (exists $METHOD_MAP{$^O}) {
695 my $map = $METHOD_MAP{$^O};
696 foreach my $name (keys %$map) {
99f36a73 697 local $^W = 0; # assignments trigger 'subroutine redefined' warning
09122b95 698 no strict 'refs';
699 *{$name} = \&{$map->{$name}};
700 }
55497cff 701}
4633a7c4 702
99f36a73 703# In case the XS version doesn't load.
704*abs_path = \&_perl_abs_path unless defined &abs_path;
705
706# added function alias for those of us more
707# used to the libc function. --tchrist 27-Jan-00
708*realpath = \&abs_path;
4633a7c4 709
a0d0e21e 7101;