diff options
author | Perl 5 Porters <perl5-porters@africa.nicoh.com> | 1997-04-17 00:00:00 +0000 |
---|---|---|
committer | Chip Salzenberg <chip@atlantic.net> | 1997-04-17 00:00:00 +0000 |
commit | 96e4d5b14cf2dfb0235faa8bc3f701c15b15bb05 (patch) | |
tree | 573ae82e0e6a92c453a5b5cec1b10dc2f99362fe /lib | |
parent | 6877a1cf6ff3f0f711772ea75e579e2e7219cc46 (diff) | |
download | perl-96e4d5b14cf2dfb0235faa8bc3f701c15b15bb05.tar.gz |
[inseparable changes from match from perl-5.003_97e to perl-5.003_97f]
CORE LANGUAGE CHANGES
Subject: New operator systell()
From: Chip Salzenberg <chip@perl.com>
Files: doio.c ext/Opcode/Opcode.pm keywords.pl opcode.pl pod/perldelta.pod pod/perldiag.pod pod/perlfunc.pod pp_sys.c t/op/sysio.t toke.c
Subject: Allow constant sub to be optimized when called with parens
From: Chip Salzenberg <chip@perl.com>
Files: toke.c
Subject: Make {,un}pack fail on invalid pack types
From: Chip Salzenberg <chip@perl.com>
Files: pod/perldiag.pod pp.c
CORE PORTABILITY
Subject: Fix bitwise ops and {,un}pack() on Cray CPUs
From: Chip Salzenberg <chip@perl.com>
Files: pp.c
Subject: VMS update
From: Charles Bailey <bailey@hmivax.humgen.upenn.edu>
Files: lib/Cwd.pm lib/File/Path.pm lib/FindBin.pm vms/perly_c.vms vms/vms.c vms/writemain.pl
Subject: Win32 update (three patches)
From: Gurusamy Sarathy <gsar@engin.umich.edu>
Files: lib/Cwd.pm lib/ExtUtils/MM_Unix.pm lib/ExtUtils/MM_Win32.pm lib/File/Basename.pm win32/Makefile win32/makedef.pl win32/perllib.c win32/win32.c win32/win32iop.h
DOCUMENTATION
Subject: Document size restrictions for packed integers
From: Jarkko Hietaniemi <Jarkko.Hietaniemi@cc.hut.fi>
Files: pod/perlfunc.pod
LIBRARY AND EXTENSIONS
Subject: Fix bug in Opcode when (maxo & 15) > 8
From: Chip Salzenberg <chip@perl.com>
Files: ext/Opcode/Makefile.PL ext/Opcode/Opcode.pm ext/Opcode/Opcode.xs
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Cwd.pm | 89 | ||||
-rw-r--r-- | lib/ExtUtils/MM_Unix.pm | 5 | ||||
-rw-r--r-- | lib/ExtUtils/MM_Win32.pm | 6 | ||||
-rw-r--r-- | lib/File/Basename.pm | 6 | ||||
-rw-r--r-- | lib/File/Path.pm | 51 | ||||
-rw-r--r-- | lib/FindBin.pm | 6 |
6 files changed, 108 insertions, 55 deletions
diff --git a/lib/Cwd.pm b/lib/Cwd.pm index e25ff4b223..efcfeca261 100644 --- a/lib/Cwd.pm +++ b/lib/Cwd.pm @@ -1,7 +1,5 @@ package Cwd; require 5.000; -require Exporter; -use Carp; =head1 NAME @@ -44,13 +42,20 @@ kept up to date if all packages which use chdir import it from Cwd. =cut +## use strict; + +use Carp; + +$VERSION = '2.00'; + +require Exporter; @ISA = qw(Exporter); @EXPORT = qw(cwd getcwd fastcwd fastgetcwd); -@EXPORT_OK = qw(chdir abs_path fast_abspath); +@EXPORT_OK = qw(chdir abs_path fast_abs_path); -# use strict; # The 'natural and safe form' for UNIX (pwd may be setuid root) + sub _backtick_pwd { my $cwd; chop($cwd = `pwd`); @@ -275,14 +280,13 @@ sub abs_path $cwd; } -sub fast_abspath -{ - my $cwd = getcwd(); - my $path = shift || '.'; - chdir($path) || croak "Cannot chdir to $path:$!"; - my $realpath = getcwd(); - chdir($cwd) || croak "Cannot chdir back to $cwd:$!"; - $realpath; +sub fast_abs_path { + my $cwd = getcwd(); + my $path = shift || '.'; + chdir($path) || croak "Cannot chdir to $path:$!"; + my $realpath = getcwd(); + chdir($cwd) || croak "Cannot chdir back to $cwd:$!"; + $realpath; } @@ -297,7 +301,14 @@ sub fast_abspath # the CRTL chdir() function persist only until Perl exits. sub _vms_cwd { - return $ENV{'DEFAULT'} + return $ENV{'DEFAULT'}; +} + +sub _vms_abs_path { + return $ENV{'DEFAULT'} unless @_; + my $path = VMS::Filespec::pathify($_[0]); + croak("Invalid path name $_[0]") unless defined $path; + return VMS::Filespec::rmsexpand($path); } sub _os2_cwd { @@ -307,7 +318,16 @@ sub _os2_cwd { return $ENV{'PWD'}; } -*_NT_cwd = \&_os2_cwd unless defined &_NT_cwd; +sub _win32_cwd { + $ENV{'PWD'} = Win32::GetCurrentDirectory(); + $ENV{'PWD'} =~ s:\\:/:g ; + return $ENV{'PWD'}; +} + +*_NT_cwd = \&_win32_cwd if (!defined &_NT_cwd && + defined &Win32::GetCurrentDirectory); + +*_NT_cwd = \&_os2_cwd unless defined &_NT_cwd; sub _msdos_cwd { $ENV{'PWD'} = `command /c cd`; @@ -320,34 +340,35 @@ sub _msdos_cwd { local $^W = 0; # assignments trigger 'subroutine redefined' warning if ($^O eq 'VMS') { - *cwd = \&_vms_cwd; - *getcwd = \&_vms_cwd; - *fastcwd = \&_vms_cwd; - *fastgetcwd = \&_vms_cwd; - *abs_path = \&fast_abspath; + *cwd = \&_vms_cwd; + *getcwd = \&_vms_cwd; + *fastcwd = \&_vms_cwd; + *fastgetcwd = \&_vms_cwd; + *abs_path = \&_vms_abs_path; + *fast_abs_path = \&_vms_abs_path; } elsif ($^O eq 'NT' or $^O eq 'MSWin32') { # We assume that &_NT_cwd is defined as an XSUB or in the core. - *cwd = \&_NT_cwd; - *getcwd = \&_NT_cwd; - *fastcwd = \&_NT_cwd; - *fastgetcwd = \&_NT_cwd; - *abs_path = \&fast_abspath; + *cwd = \&_NT_cwd; + *getcwd = \&_NT_cwd; + *fastcwd = \&_NT_cwd; + *fastgetcwd = \&_NT_cwd; + *abs_path = \&fast_abs_path; } elsif ($^O eq 'os2') { # sys_cwd may keep the builtin command - *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; - *getcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; - *fastgetcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; - *fastcwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; - *abs_path = \&fast_abspath; + *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; + *getcwd = \&cwd; + *fastgetcwd = \&cwd; + *fastcwd = \&cwd; + *abs_path = \&fast_abs_path; } elsif ($^O eq 'msdos') { - *cwd = \&_msdos_cwd; - *getcwd = \&_msdos_cwd; - *fastgetcwd = \&_msdos_cwd; - *fastcwd = \&_msdos_cwd; - *abs_path = \&fast_abspath; + *cwd = \&_msdos_cwd; + *getcwd = \&_msdos_cwd; + *fastgetcwd = \&_msdos_cwd; + *fastcwd = \&_msdos_cwd; + *abs_path = \&fast_abs_path; } } diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index b2466f1c3e..b8f1f0adfa 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -2839,7 +2839,10 @@ sub test { # --- Test and Installation Sections --- my($self, %attribs) = @_; - my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : ""); + my $tests = $attribs{TESTS}; + if (!$tests && -d 't') { + $tests = $Is_Win32 ? join(' ', <t\\*.t>) : 't/*.t'; + } my(@m); push(@m," TEST_VERBOSE=0 diff --git a/lib/ExtUtils/MM_Win32.pm b/lib/ExtUtils/MM_Win32.pm index d001901f37..e3161b5412 100644 --- a/lib/ExtUtils/MM_Win32.pm +++ b/lib/ExtUtils/MM_Win32.pm @@ -130,9 +130,8 @@ sub catfile { my $file = pop @_; return $file unless @_; my $dir = $self->catdir(@_); - for ($dir) { - $_ .= "\\" unless substr($_,length($_)-1,1) eq "\\"; - } + $dir =~ s/(\\\.)$//; + $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\"; return $dir.$file; } @@ -256,6 +255,7 @@ path. On UNIX eliminated successive slashes and successive "/.". sub canonpath { my($self,$path) = @_; + $path =~ s/^([a-z]:)/\u$1/; $path =~ s|/|\\|g; $path =~ s|\\+|\\|g ; # xx////xx -> xx/xx $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx diff --git a/lib/File/Basename.pm b/lib/File/Basename.pm index 3ceb10e6c1..e4863f8911 100644 --- a/lib/File/Basename.pm +++ b/lib/File/Basename.pm @@ -162,7 +162,7 @@ sub fileparse { ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/); } } - if ($fstype =~ /^MSDOS/i) { + if ($fstype =~ /^MS(DOS|Win32)/i) { ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/); $dirpath .= '.\\' unless $dirpath =~ /[\\\/]$/; } @@ -173,10 +173,6 @@ sub fileparse { ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/); $dirpath = './' unless $dirpath; } - elsif ($fstype =~ /^MSWin32/i) { - ($dirpath,$basename) = ($fullname =~ /^(.*[:\\\/])?(.*)/); - $dirpath .= ".\\" unless $dirpath =~ /[\\\/]$/; - } elsif ($fstype !~ /^VMS/i) { # default to Unix ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#); $dirpath = './' unless $dirpath; diff --git a/lib/File/Path.pm b/lib/File/Path.pm index e086028300..419bd03adf 100644 --- a/lib/File/Path.pm +++ b/lib/File/Path.pm @@ -69,21 +69,30 @@ skip any files to which you do not have delete access (if running under VMS) or write access (if running under another OS). This will change in the future when a criterion for 'delete permission' under OSs other -than VMS is settled. (defaults to FALSE) +than VMS is settled. (defaults to FALSE) =back -It returns the number of files successfully deleted. Symlinks are +It returns the number of files successfully deleted. Symlinks are treated as ordinary files. +B<NOTE:> If the third parameter is not TRUE, C<rmtree> is B<unsecure> +in the face of failure or interruption. Files and directories which +were not deleted may be left with permissions reset to allow world +read and write access. Note also that the occurrence of errors in +rmtree can be determined I<only> by trapping diagnostic messages +using C<$SIG{__WARN__}>; it is not apparent from the return value. +Therefore, you must be extremely careful about using C<rmtree($foo,$bar,0> +in situations where security is an issue. + =head1 AUTHORS -Tim Bunce E<lt>F<Tim.Bunce@ig.co.uk>E<gt> -Charles Bailey E<lt>F<bailey@genetics.upenn.edu>E<gt> +Tim Bunce <F<Tim.Bunce@ig.co.uk>> and +Charles Bailey <F<bailey@genetics.upenn.edu>> =head1 REVISION -Current $VERSION is 1.02. +Current $VERSION is 1.03. =cut @@ -94,7 +103,7 @@ use Exporter (); use strict; use vars qw( $VERSION @ISA @EXPORT ); -$VERSION = "1.02"; +$VERSION = "1.03"; @ISA = qw( Exporter ); @EXPORT = qw( mkpath rmtree ); @@ -138,13 +147,14 @@ sub rmtree { my($root); foreach $root (@{$roots}) { $root =~ s#/$##; - $count++, next unless -e $root; + next unless -e $root; if (not -l $root and -d _) { # notabene: 0777 is for making readable in the first place, # it's also intended to change it to writable in case we have # to recurse in which case we are better than rm -rf for # subtrees with strange permissions - chmod 0777, $root + my $rp = (stat(_))[2] & 0777; #Is this portable??? + chmod(0777, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) or carp "Can't make directory $root read+writeable: $!" unless $safe; @@ -168,8 +178,15 @@ sub rmtree { or carp "Can't make directory $root writeable: $!" if $force_writeable; print "rmdir $root\n" if $verbose; - rmdir($root) && ++$count - or carp "Can't remove directory $root: $!"; + if (rmdir $root) { + ++$count; + } + else { + carp "Can't remove directory $root: $!"; + chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) + or carp("and can't restore permissions to " + . sprintf("0%o",$rp) . "\n"); + } } else { if ($safe && @@ -177,14 +194,24 @@ sub rmtree { print "skipped $root\n" if $verbose; next; } + my $rp = (stat(_))[2] & 0777; #Is this portable??? chmod 0666, $root or carp "Can't make file $root writeable: $!" if $force_writeable; print "unlink $root\n" if $verbose; # delete all versions under VMS while (-e $root || -l $root) { - unlink($root) && ++$count - or croak "Can't unlink file $root: $!"; + if (unlink $root) { + ++$count; + } + else { + carp "Can't unlink file $root: $!"; + if ($force_writeable) { + chmod $rp, $root + or carp("and can't restore permissions to " + . sprintf("0%o",$rp) . "\n"); + } + } } } } diff --git a/lib/FindBin.pm b/lib/FindBin.pm index d908121ded..918775cda7 100644 --- a/lib/FindBin.pm +++ b/lib/FindBin.pm @@ -91,6 +91,12 @@ sub is_abs_path { return m#^[a-z]:[\\/]#i; } + elsif ($^O eq 'VMS') + { + # If it's a logical name, expand it. + $_ = $ENV{$_} while /^[\w\$\-]+$/ and $ENV{$_}; + return m!^/! or m![<\[][^.\-\]>]! or /:[^<\[]/; + } else { return m#^/#; |