X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FFile%2FPath.pm;h=5cb9d44bc0e2603092d49d78985afff805522eb2;hb=fa76202e3aa22e9755f1a461416769c368b47afc;hp=3560a970a26c2b32b6638f07a3a59e800888cb1f;hpb=3b825e419da1c361eab06a1e6d287276c0aef241;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/File/Path.pm b/lib/File/Path.pm index 3560a97..5cb9d44 100644 --- a/lib/File/Path.pm +++ b/lib/File/Path.pm @@ -40,6 +40,15 @@ the numeric mode to use when creating the directories It returns a list of all directories (including intermediates, determined using the Unix '/' separator) created. +If a system error prevents a directory from being created, then the +C function throws a fatal error with C. This error +can be trapped with an C block: + + eval { mkpath($dir) }; + if ($@) { + print "Couldn't create $dir: $@"; + } + Similarly, the C function provides a convenient way to delete a subtree from the directory structure, much like the Unix command C. C takes three arguments: @@ -81,9 +90,21 @@ 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 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 +Therefore, you must be extremely careful about using C in situations where security is an issue. +=head1 DIAGNOSTICS + +=over 4 + +=item * + +On Windows, if C gives you the warning: B, this may mean that you've exceeded your filesystem's +maximum path length. + +=back + =head1 AUTHORS Tim Bunce > and @@ -98,7 +119,7 @@ use Exporter (); use strict; use warnings; -our $VERSION = "1.0405"; +our $VERSION = "1.05"; our @ISA = qw( Exporter ); our @EXPORT = qw( mkpath rmtree ); @@ -180,7 +201,13 @@ sub rmtree { unless $safe; if (opendir my $d, $root) { - @files = readdir $d; + no strict 'refs'; + if (!defined ${"\cTAINT"} or ${"\cTAINT"}) { + # Blindly untaint dir names + @files = map { /^(.*)$/s ; $1 } readdir $d; + } else { + @files = readdir $d; + } closedir $d; } else {