Following 32238, change "interpreter_size" to "interp_size" in the new
[p5sagit/p5-mst-13.2.git] / lib / File / Path.pm
1 package File::Path;
2
3 use 5.005_04;
4 use strict;
5
6 use Cwd 'getcwd';
7 use File::Basename ();
8 use File::Spec     ();
9
10 BEGIN {
11     if ($] < 5.006) {
12         # can't say 'opendir my $dh, $dirname'
13         # need to initialise $dh
14         eval "use Symbol";
15     }
16 }
17
18 use Exporter ();
19 use vars qw($VERSION @ISA @EXPORT);
20 $VERSION = '2.02';
21 @ISA     = qw(Exporter);
22 @EXPORT  = qw(mkpath rmtree);
23
24 my $Is_VMS   = $^O eq 'VMS';
25 my $Is_MacOS = $^O eq 'MacOS';
26
27 # These OSes complain if you want to remove a file that you have no
28 # write permission to:
29 my $Force_Writeable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32' ||
30                        $^O eq 'amigaos' || $^O eq 'MacOS' || $^O eq 'epoc');
31
32 sub _carp {
33     require Carp;
34     goto &Carp::carp;
35 }
36
37 sub _croak {
38     require Carp;
39     goto &Carp::croak;
40 }
41
42 sub _error {
43     my $arg     = shift;
44     my $message = shift;
45     my $object  = shift;
46
47     if ($arg->{error}) {
48         $object = '' unless defined $object;
49         push @{${$arg->{error}}}, {$object => "$message: $!"};
50     }
51     else {
52         _carp(defined($object) ? "$message for $object: $!" : "$message: $!");
53     }
54 }
55
56 sub mkpath {
57     my $old_style = (
58         UNIVERSAL::isa($_[0],'ARRAY')
59         or (@_ == 2 and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1))
60         or (@_ == 3
61             and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1)
62             and (defined $_[2] ? $_[2] =~ /\A\d+\z/ : 1)
63         )
64     ) ? 1 : 0;
65
66     my $arg;
67     my $paths;
68
69     if ($old_style) {
70         my ($verbose, $mode);
71         ($paths, $verbose, $mode) = @_;
72         $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
73         $arg->{verbose} = defined $verbose ? $verbose : 0;
74         $arg->{mode}    = defined $mode    ? $mode    : 0777;
75     }
76     else {
77         if (@_ > 0 and UNIVERSAL::isa($_[-1], 'HASH')) {
78             $arg = pop @_;
79             exists $arg->{mask} and $arg->{mode} = delete $arg->{mask};
80             $arg->{mode} = 0777 unless exists $arg->{mode};
81             ${$arg->{error}} = [] if exists $arg->{error};
82         }
83         else {
84             @{$arg}{qw(verbose mode)} = (0, 0777);
85         }
86         $paths = [@_];
87     }
88     return _mkpath($arg, $paths);
89 }
90
91 sub _mkpath {
92     my $arg   = shift;
93     my $paths = shift;
94
95     local($")=$Is_MacOS ? ":" : "/";
96     my(@created,$path);
97     foreach $path (@$paths) {
98         next unless length($path);
99         $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT 
100         # Logic wants Unix paths, so go with the flow.
101         if ($Is_VMS) {
102             next if $path eq '/';
103             $path = VMS::Filespec::unixify($path);
104         }
105         next if -d $path;
106         my $parent = File::Basename::dirname($path);
107         unless (-d $parent or $path eq $parent) {
108             push(@created,_mkpath($arg, [$parent]));
109         }
110         print "mkdir $path\n" if $arg->{verbose};
111         if (mkdir($path,$arg->{mode})) {
112             push(@created, $path);
113         }
114         else {
115             my $save_bang = $!;
116             my ($e, $e1) = ($save_bang, $^E);
117             $e .= "; $e1" if $e ne $e1;
118             # allow for another process to have created it meanwhile
119             if (!-d $path) {
120                 $! = $save_bang;
121                 if ($arg->{error}) {
122                     push @{${$arg->{error}}}, {$path => $e};
123                 }
124                 else {
125                     _croak("mkdir $path: $e");
126                 }
127             }
128         }
129     }
130     return @created;
131 }
132
133 sub rmtree {
134     my $old_style = (
135         UNIVERSAL::isa($_[0],'ARRAY')
136         or (@_ == 2 and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1))
137         or (@_ == 3
138             and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1)
139             and (defined $_[2] ? $_[2] =~ /\A\d+\z/ : 1)
140         )
141     ) ? 1 : 0;
142
143     my $arg;
144     my $paths;
145
146     if ($old_style) {
147         my ($verbose, $safe);
148         ($paths, $verbose, $safe) = @_;
149         $arg->{verbose} = defined $verbose ? $verbose : 0;
150         $arg->{safe}    = defined $safe    ? $safe    : 0;
151
152         if (defined($paths) and length($paths)) {
153             $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
154         }
155         else {
156             _carp ("No root path(s) specified\n");
157             return 0;
158         }
159     }
160     else {
161         if (@_ > 0 and UNIVERSAL::isa($_[-1],'HASH')) {
162             $arg = pop @_;
163             ${$arg->{error}}  = [] if exists $arg->{error};
164             ${$arg->{result}} = [] if exists $arg->{result};
165         }
166         else {
167             @{$arg}{qw(verbose safe)} = (0, 0);
168         }
169         $paths = [@_];
170     }
171
172     $arg->{prefix} = '';
173     $arg->{depth}  = 0;
174
175     $arg->{cwd} = getcwd() or do {
176         _error($arg, "cannot fetch initial working directory");
177         return 0;
178     };
179     for ($arg->{cwd}) { /\A(.*)\Z/; $_ = $1 } # untaint
180
181     @{$arg}{qw(device inode)} = (stat $arg->{cwd})[0,1] or do {
182         _error($arg, "cannot stat initial working directory", $arg->{cwd});
183         return 0;
184     };
185
186     return _rmtree($arg, $paths);
187 }
188
189 sub _rmtree {
190     my $arg   = shift;
191     my $paths = shift;
192
193     my $count  = 0;
194     my $curdir = File::Spec->curdir();
195     my $updir  = File::Spec->updir();
196
197     my (@files, $root);
198     ROOT_DIR:
199     foreach $root (@$paths) {
200         if ($Is_MacOS) {
201             $root  = ":$root" unless $root =~ /:/;
202             $root .= ":"      unless $root =~ /:\z/;
203         }
204         else {
205             $root =~ s{/\z}{};
206         }
207
208         # since we chdir into each directory, it may not be obvious
209         # to figure out where we are if we generate a message about
210         # a file name. We therefore construct a semi-canonical
211         # filename, anchored from the directory being unlinked (as
212         # opposed to being truly canonical, anchored from the root (/).
213
214         my $canon = $arg->{prefix}
215             ? File::Spec->catfile($arg->{prefix}, $root)
216             : $root
217         ;
218
219         my ($ldev, $lino, $perm) = (lstat $root)[0,1,2] or next ROOT_DIR;
220
221         if ( -d _ ) {
222             $root = VMS::Filespec::pathify($root) if $Is_VMS;
223             if (!chdir($root)) {
224                 # see if we can escalate privileges to get in
225                 # (e.g. funny protection mask such as -w- instead of rwx)
226                 $perm &= 07777;
227                 my $nperm = $perm | 0700;
228                 if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $root))) {
229                     _error($arg, "cannot make child directory read-write-exec", $canon);
230                     next ROOT_DIR;
231                 }
232                 elsif (!chdir($root)) {
233                     _error($arg, "cannot chdir to child", $canon);
234                     next ROOT_DIR;
235                 }
236             }
237
238             my ($device, $inode, $perm) = (stat $curdir)[0,1,2] or do {
239                 _error($arg, "cannot stat current working directory", $canon);
240                 next ROOT_DIR;
241             };
242
243             ($ldev eq $device and $lino eq $inode)
244                 or _croak("directory $canon changed before chdir, expected dev=$ldev inode=$lino, actual dev=$device ino=$inode, aborting.");
245
246             $perm &= 07777; # don't forget setuid, setgid, sticky bits
247             my $nperm = $perm | 0700;
248
249             # notabene: 0700 is for making readable in the first place,
250             # it's also intended to change it to writable in case we have
251             # to recurse in which case we are better than rm -rf for 
252             # subtrees with strange permissions
253
254             if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $curdir))) {
255                 _error($arg, "cannot make directory read+writeable", $canon);
256                 $nperm = $perm;
257             }
258
259             my $d;
260             $d = gensym() if $] < 5.006;
261             if (!opendir $d, $curdir) {
262                 _error($arg, "cannot opendir", $canon);
263                 @files = ();
264             }
265             else {
266                 no strict 'refs';
267                 if (!defined ${"\cTAINT"} or ${"\cTAINT"}) {
268                     # Blindly untaint dir names if taint mode is
269                     # active, or any perl < 5.006
270                     @files = map { /\A(.*)\z/s; $1 } readdir $d;
271                 }
272                 else {
273                     @files = readdir $d;
274                 }
275                 closedir $d;
276             }
277
278             if ($Is_VMS) {
279                 # Deleting large numbers of files from VMS Files-11
280                 # filesystems is faster if done in reverse ASCIIbetical order.
281                 # include '.' to '.;' from blead patch #31775
282                 @files = map {$_ eq '.' ? '.;' : $_} reverse @files;
283                 ($root = VMS::Filespec::unixify($root)) =~ s/\.dir\z//;
284             }
285             @files = grep {$_ ne $updir and $_ ne $curdir} @files;
286
287             if (@files) {
288                 # remove the contained files before the directory itself
289                 my $narg = {%$arg};
290                 @{$narg}{qw(device inode cwd prefix depth)}
291                     = ($device, $inode, $updir, $canon, $arg->{depth}+1);
292                 $count += _rmtree($narg, \@files);
293             }
294
295             # restore directory permissions of required now (in case the rmdir
296             # below fails), while we are still in the directory and may do so
297             # without a race via '.'
298             if ($nperm != $perm and not chmod($perm, $curdir)) {
299                 _error($arg, "cannot reset chmod", $canon);
300             }
301
302             # don't leave the client code in an unexpected directory
303             chdir($arg->{cwd})
304                 or _croak("cannot chdir to $arg->{cwd} from $canon: $!, aborting.");
305
306             # ensure that a chdir upwards didn't take us somewhere other
307             # than we expected (see CVE-2002-0435)
308             ($device, $inode) = (stat $curdir)[0,1]
309                 or _croak("cannot stat prior working directory $arg->{cwd}: $!, aborting.");
310
311             ($arg->{device} eq $device and $arg->{inode} eq $inode)
312                 or _croak("previous directory $arg->{cwd} changed before entering $canon, expected dev=$ldev inode=$lino, actual dev=$device ino=$inode, aborting.");
313
314             if ($arg->{depth} or !$arg->{keep_root}) {
315                 if ($arg->{safe} &&
316                     ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
317                     print "skipped $root\n" if $arg->{verbose};
318                     next ROOT_DIR;
319                 }
320                 if (!chmod $perm | 0700, $root) {
321                     if ($Force_Writeable) {
322                         _error($arg, "cannot make directory writeable", $canon);
323                     }
324                 }
325                 print "rmdir $root\n" if $arg->{verbose};
326                 if (rmdir $root) {
327                     push @{${$arg->{result}}}, $root if $arg->{result};
328                     ++$count;
329                 }
330                 else {
331                     _error($arg, "cannot remove directory", $canon);
332                     if (!chmod($perm, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
333                     ) {
334                         _error($arg, sprintf("cannot restore permissions to 0%o",$perm), $canon);
335                     }
336                 }
337             }
338         }
339         else {
340             # not a directory
341
342             $root = VMS::Filespec::vmsify("./$root")
343                 if $Is_VMS && !File::Spec->file_name_is_absolute($root);
344
345             if ($arg->{safe} &&
346                 ($Is_VMS ? !&VMS::Filespec::candelete($root)
347                          : !(-l $root || -w $root)))
348             {
349                 print "skipped $root\n" if $arg->{verbose};
350                 next ROOT_DIR;
351             }
352
353             my $nperm = $perm & 07777 | 0600;
354             if ($nperm != $perm and not chmod $nperm, $root) {
355                 if ($Force_Writeable) {
356                     _error($arg, "cannot make file writeable", $canon);
357                 }
358             }
359             print "unlink $canon\n" if $arg->{verbose};
360             # delete all versions under VMS
361             for (;;) {
362                 if (unlink $root) {
363                     push @{${$arg->{result}}}, $root if $arg->{result};
364                 }
365                 else {
366                     _error($arg, "cannot unlink file", $canon);
367                     $Force_Writeable and chmod($perm, $root) or
368                         _error($arg, sprintf("cannot restore permissions to 0%o",$perm), $canon);
369                     last;
370                 }
371                 ++$count;
372                 last unless $Is_VMS && lstat $root;
373             }
374         }
375     }
376
377     return $count;
378 }
379
380 1;
381 __END__
382
383 =head1 NAME
384
385 File::Path - Create or remove directory trees
386
387 =head1 VERSION
388
389 This document describes version 2.02 of File::Path, released
390 2007-10-24.
391
392 =head1 SYNOPSIS
393
394     use File::Path;
395
396     # modern
397     mkpath( 'foo/bar/baz', '/zug/zwang', {verbose => 1} );
398
399     rmtree(
400         'foo/bar/baz', '/zug/zwang',
401         { verbose => 1, error  => \my $err_list }
402     );
403
404     # traditional
405     mkpath(['/foo/bar/baz', 'blurfl/quux'], 1, 0711);
406     rmtree(['foo/bar/baz', 'blurfl/quux'], 1, 1);
407
408 =head1 DESCRIPTION
409
410 The C<mkpath> function provides a convenient way to create directories
411 of arbitrary depth. Similarly, the C<rmtree> function provides a
412 convenient way to delete an entire directory subtree from the
413 filesystem, much like the Unix command C<rm -r>.
414
415 Both functions may be called in one of two ways, the traditional,
416 compatible with code written since the dawn of time, and modern,
417 that offers a more flexible and readable idiom. New code should use
418 the modern interface.
419
420 =head2 FUNCTIONS
421
422 The modern way of calling C<mkpath> and C<rmtree> is with a list
423 of directories to create, or remove, respectively, followed by an
424 optional hash reference containing keys to control the
425 function's behaviour.
426
427 =head3 C<mkpath>
428
429 The following keys are recognised as parameters to C<mkpath>.
430 The function returns the list of files actually created during the
431 call.
432
433   my @created = mkpath(
434     qw(/tmp /flub /home/nobody),
435     {verbose => 1, mode => 0750},
436   );
437   print "created $_\n" for @created;
438
439 =over 4
440
441 =item mode
442
443 The numeric permissions mode to apply to each created directory
444 (defaults to 0777), to be modified by the current C<umask>. If the
445 directory already exists (and thus does not need to be created),
446 the permissions will not be modified.
447
448 C<mask> is recognised as an alias for this parameter.
449
450 =item verbose
451
452 If present, will cause C<mkpath> to print the name of each directory
453 as it is created. By default nothing is printed.
454
455 =item error
456
457 If present, will be interpreted as a reference to a list, and will
458 be used to store any errors that are encountered.  See the ERROR
459 HANDLING section for more information.
460
461 If this parameter is not used, certain error conditions may raise
462 a fatal error that will cause the program will halt, unless trapped
463 in an C<eval> block.
464
465 =back
466
467 =head3 C<rmtree>
468
469 =over 4
470
471 =item verbose
472
473 If present, will cause C<rmtree> to print the name of each file as
474 it is unlinked. By default nothing is printed.
475
476 =item safe
477
478 When set to a true value, will cause C<rmtree> to skip the files
479 for which the process lacks the required privileges needed to delete
480 files, such as delete privileges on VMS. In other words, the code
481 will make no attempt to alter file permissions. Thus, if the process
482 is interrupted, no filesystem object will be left in a more
483 permissive mode.
484
485 =item keep_root
486
487 When set to a true value, will cause all files and subdirectories
488 to be removed, except the initially specified directories. This comes
489 in handy when cleaning out an application's scratch directory.
490
491   rmtree( '/tmp', {keep_root => 1} );
492
493 =item result
494
495 If present, will be interpreted as a reference to a list, and will
496 be used to store the list of all files and directories unlinked
497 during the call. If nothing is unlinked, a reference to an empty
498 list is returned (rather than C<undef>).
499
500   rmtree( '/tmp', {result => \my $list} );
501   print "unlinked $_\n" for @$list;
502
503 This is a useful alternative to the C<verbose> key.
504
505 =item error
506
507 If present, will be interpreted as a reference to a list,
508 and will be used to store any errors that are encountered.
509 See the ERROR HANDLING section for more information.
510
511 Removing things is a much more dangerous proposition than
512 creating things. As such, there are certain conditions that
513 C<rmtree> may encounter that are so dangerous that the only
514 sane action left is to kill the program.
515
516 Use C<error> to trap all that is reasonable (problems with
517 permissions and the like), and let it die if things get out
518 of hand. This is the safest course of action.
519
520 =back
521
522 =head2 TRADITIONAL INTERFACE
523
524 The old interfaces of C<mkpath> and C<rmtree> take a reference to
525 a list of directories (to create or remove), followed by a series
526 of positional, numeric, modal parameters that control their behaviour.
527
528 This design made it difficult to add additional functionality, as
529 well as posed the problem of what to do when the calling code only
530 needs to set the last parameter. Even though the code doesn't care
531 how the initial positional parameters are set, the programmer is
532 forced to learn what the defaults are, and specify them.
533
534 Worse, if it turns out in the future that it would make more sense
535 to change the default behaviour of the first parameter (for example,
536 to avoid a security vulnerability), all existing code will remain
537 hard-wired to the wrong defaults.
538
539 Finally, a series of numeric parameters are much less self-documenting
540 in terms of communicating to the reader what the code is doing. Named
541 parameters do not have this problem.
542
543 In the traditional API, C<mkpath> takes three arguments:
544
545 =over 4
546
547 =item *
548
549 The name of the path to create, or a reference to a list of paths
550 to create,
551
552 =item *
553
554 a boolean value, which if TRUE will cause C<mkpath> to print the
555 name of each directory as it is created (defaults to FALSE), and
556
557 =item *
558
559 the numeric mode to use when creating the directories (defaults to
560 0777), to be modified by the current umask.
561
562 =back
563
564 It returns a list of all directories (including intermediates, determined
565 using the Unix '/' separator) created.  In scalar context it returns
566 the number of directories created.
567
568 If a system error prevents a directory from being created, then the
569 C<mkpath> function throws a fatal error with C<Carp::croak>. This error
570 can be trapped with an C<eval> block:
571
572   eval { mkpath($dir) };
573   if ($@) {
574     print "Couldn't create $dir: $@";
575   }
576
577 In the traditional API, C<rmtree> takes three arguments:
578
579 =over 4
580
581 =item *
582
583 the root of the subtree to delete, or a reference to a list of
584 roots. All of the files and directories below each root, as well
585 as the roots themselves, will be deleted. If you want to keep
586 the roots themselves, you must use the modern API.
587
588 =item *
589
590 a boolean value, which if TRUE will cause C<rmtree> to print a
591 message each time it examines a file, giving the name of the file,
592 and indicating whether it's using C<rmdir> or C<unlink> to remove
593 it, or that it's skipping it.  (defaults to FALSE)
594
595 =item *
596
597 a boolean value, which if TRUE will cause C<rmtree> to skip any
598 files to which you do not have delete access (if running under VMS)
599 or write access (if running under another OS). This will change
600 in the future when a criterion for 'delete permission' under OSs
601 other than VMS is settled.  (defaults to FALSE)
602
603 =back
604
605 It returns the number of files, directories and symlinks successfully
606 deleted.  Symlinks are simply deleted and not followed.
607
608 Note also that the occurrence of errors in C<rmtree> using the
609 traditional interface can be determined I<only> by trapping diagnostic
610 messages using C<$SIG{__WARN__}>; it is not apparent from the return
611 value. (The modern interface may use the C<error> parameter to
612 record any problems encountered).
613
614 =head2 ERROR HANDLING
615
616 If C<mkpath> or C<rmtree> encounter an error, a diagnostic message
617 will be printed to C<STDERR> via C<carp> (for non-fatal errors),
618 or via C<croak> (for fatal errors).
619
620 If this behaviour is not desirable, the C<error> attribute may be
621 used to hold a reference to a variable, which will be used to store
622 the diagnostics. The result is a reference to a list of hash
623 references. For each hash reference, the key is the name of the
624 file, and the value is the error message (usually the contents of
625 C<$!>). An example usage looks like:
626
627   rmpath( 'foo/bar', 'bar/rat', {error => \my $err} );
628   for my $diag (@$err) {
629     my ($file, $message) = each %$diag;
630     print "problem unlinking $file: $message\n";
631   }
632
633 If no errors are encountered, C<$err> will point to an empty list
634 (thus there is no need to test for C<undef>). If a general error
635 is encountered (for instance, C<rmtree> attempts to remove a directory
636 tree that does not exist), the diagnostic key will be empty, only
637 the value will be set:
638
639   rmpath( '/no/such/path', {error => \my $err} );
640   for my $diag (@$err) {
641     my ($file, $message) = each %$diag;
642     if ($file eq '') {
643       print "general error: $message\n";
644     }
645   }
646
647 =head2 NOTES
648
649 C<File::Path> blindly exports C<mkpath> and C<rmtree> into the
650 current namespace. These days, this is considered bad style, but
651 to change it now would break too much code. Nonetheless, you are
652 invited to specify what it is you are expecting to use:
653
654   use File::Path 'rmtree';
655
656 =head3 HEURISTICS
657
658 The functions detect (as far as possible) which way they are being
659 called and will act appropriately. It is important to remember that
660 the heuristic for detecting the old style is either the presence
661 of an array reference, or two or three parameters total and second
662 and third parameters are numeric. Hence...
663
664     mkpath 486, 487, 488;
665
666 ... will not assume the modern style and create three directories, rather
667 it will create one directory verbosely, setting the permission to
668 0750 (488 being the decimal equivalent of octal 750). Here, old
669 style trumps new. It must, for backwards compatibility reasons.
670
671 If you want to ensure there is absolutely no ambiguity about which
672 way the function will behave, make sure the first parameter is a
673 reference to a one-element list, to force the old style interpretation:
674
675     mkpath [486], 487, 488;
676
677 and get only one directory created. Or add a reference to an empty
678 parameter hash, to force the new style:
679
680     mkpath 486, 487, 488, {};
681
682 ... and hence create the three directories. If the empty hash
683 reference seems a little strange to your eyes, or you suspect a
684 subsequent programmer might I<helpfully> optimise it away, you
685 can add a parameter set to a default value:
686
687     mkpath 486, 487, 488, {verbose => 0};
688
689 =head3 SECURITY CONSIDERATIONS
690
691 There were race conditions 1.x implementations of File::Path's
692 C<rmtree> function (although sometimes patched depending on the OS
693 distribution or platform). The 2.0 version contains code to avoid the
694 problem mentioned in CVE-2002-0435.
695
696 See the following pages for more information:
697
698   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=286905
699   http://www.nntp.perl.org/group/perl.perl5.porters/2005/01/msg97623.html
700   http://www.debian.org/security/2005/dsa-696
701
702 Additionally, unless the C<safe> parameter is set (or the
703 third parameter in the traditional interface is TRUE), should a
704 C<rmtree> be interrupted, files that were originally in read-only
705 mode may now have their permissions set to a read-write (or "delete
706 OK") mode.
707
708 =head1 DIAGNOSTICS
709
710 FATAL errors will cause the program to halt (C<croak>), since the
711 problem is so severe that it would be dangerous to continue. (This
712 can always be trapped with C<eval>, but it's not a good idea. Under
713 the circumstances, dying is the best thing to do).
714
715 SEVERE errors may be trapped using the modern interface. If the
716 they are not trapped, or the old interface is used, such an error
717 will cause the program will halt.
718
719 All other errors may be trapped using the modern interface, otherwise
720 they will be C<carp>ed about. Program execution will not be halted.
721
722 =over 4
723
724 =item mkdir [path]: [errmsg] (SEVERE)
725
726 C<mkpath> was unable to create the path. Probably some sort of
727 permissions error at the point of departure, or insufficient resources
728 (such as free inodes on Unix).
729
730 =item No root path(s) specified
731
732 C<mkpath> was not given any paths to create. This message is only
733 emitted if the routine is called with the traditional interface.
734 The modern interface will remain silent if given nothing to do.
735
736 =item No such file or directory
737
738 On Windows, if C<mkpath> gives you this warning, it may mean that
739 you have exceeded your filesystem's maximum path length.
740
741 =item cannot fetch initial working directory: [errmsg]
742
743 C<rmtree> attempted to determine the initial directory by calling
744 C<Cwd::getcwd>, but the call failed for some reason. No attempt
745 will be made to delete anything.
746
747 =item cannot stat initial working directory: [errmsg]
748
749 C<rmtree> attempted to stat the initial directory (after having
750 successfully obtained its name via C<getcwd>), however, the call
751 failed for some reason. No attempt will be made to delete anything.
752
753 =item cannot chdir to [dir]: [errmsg]
754
755 C<rmtree> attempted to set the working directory in order to
756 begin deleting the objects therein, but was unsuccessful. This is
757 usually a permissions issue. The routine will continue to delete
758 other things, but this directory will be left intact.
759
760 =item directory [dir] changed before chdir, expected dev=[n] inode=[n], actual dev=[n] ino=[n], aborting. (FATAL)
761
762 C<rmtree> recorded the device and inode of a directory, and then
763 moved into it. It then performed a C<stat> on the current directory
764 and detected that the device and inode were no longer the same. As
765 this is at the heart of the race condition problem, the program
766 will die at this point.
767
768 =item cannot make directory [dir] read+writeable: [errmsg]
769
770 C<rmtree> attempted to change the permissions on the current directory
771 to ensure that subsequent unlinkings would not run into problems,
772 but was unable to do so. The permissions remain as they were, and
773 the program will carry on, doing the best it can.
774
775 =item cannot read [dir]: [errmsg]
776
777 C<rmtree> tried to read the contents of the directory in order
778 to acquire the names of the directory entries to be unlinked, but
779 was unsuccessful. This is usually a permissions issue. The
780 program will continue, but the files in this directory will remain
781 after the call.
782
783 =item cannot reset chmod [dir]: [errmsg]
784
785 C<rmtree>, after having deleted everything in a directory, attempted
786 to restore its permissions to the original state but failed. The
787 directory may wind up being left behind.
788
789 =item cannot chdir to [parent-dir] from [child-dir]: [errmsg], aborting. (FATAL)
790
791 C<rmtree>, after having deleted everything and restored the permissions
792 of a directory, was unable to chdir back to the parent. This is usually
793 a sign that something evil this way comes.
794
795 =item cannot stat prior working directory [dir]: [errmsg], aborting. (FATAL)
796
797 C<rmtree> was unable to stat the parent directory after have returned
798 from the child. Since there is no way of knowing if we returned to
799 where we think we should be (by comparing device and inode) the only
800 way out is to C<croak>.
801
802 =item previous directory [parent-dir] changed before entering [child-dir], expected dev=[n] inode=[n], actual dev=[n] ino=[n], aborting. (FATAL)
803
804 When C<rmtree> returned from deleting files in a child directory, a
805 check revealed that the parent directory it returned to wasn't the one
806 it started out from. This is considered a sign of malicious activity.
807
808 =item cannot make directory [dir] writeable: [errmsg]
809
810 Just before removing a directory (after having successfully removed
811 everything it contained), C<rmtree> attempted to set the permissions
812 on the directory to ensure it could be removed and failed. Program
813 execution continues, but the directory may possibly not be deleted.
814
815 =item cannot remove directory [dir]: [errmsg]
816
817 C<rmtree> attempted to remove a directory, but failed. This may because
818 some objects that were unable to be removed remain in the directory, or
819 a permissions issue. The directory will be left behind.
820
821 =item cannot restore permissions of [dir] to [0nnn]: [errmsg]
822
823 After having failed to remove a directory, C<rmtree> was unable to
824 restore its permissions from a permissive state back to a possibly
825 more restrictive setting. (Permissions given in octal).
826
827 =item cannot make file [file] writeable: [errmsg]
828
829 C<rmtree> attempted to force the permissions of a file to ensure it
830 could be deleted, but failed to do so. It will, however, still attempt
831 to unlink the file.
832
833 =item cannot unlink file [file]: [errmsg]
834
835 C<rmtree> failed to remove a file. Probably a permissions issue.
836
837 =item cannot restore permissions of [file] to [0nnn]: [errmsg]
838
839 After having failed to remove a file, C<rmtree> was also unable
840 to restore the permissions on the file to a possibly less permissive
841 setting. (Permissions given in octal).
842
843 =back
844
845 =head1 SEE ALSO
846
847 =over 4
848
849 =item *
850
851 L<File::Find::Rule>
852
853 When removing directory trees, if you want to examine each file to
854 decide whether to delete it (and possibly leaving large swathes
855 alone), F<File::Find::Rule> offers a convenient and flexible approach
856 to examining directory trees.
857
858 =back
859
860 =head1 BUGS
861
862 Please report all bugs on the RT queue:
863
864 L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=File-Path>
865
866 =head1 ACKNOWLEDGEMENTS
867
868 Paul Szabo identified the race condition originally, and Brendan
869 O'Dea wrote an implementation for Debian that addressed the problem.
870 That code was used as a basis for the current code. Their efforts
871 are greatly appreciated.
872
873 =head1 AUTHORS
874
875 Tim Bunce <F<Tim.Bunce@ig.co.uk>> and Charles Bailey
876 <F<bailey@newman.upenn.edu>>. Currently maintained by David Landgren
877 <F<david@landgren.net>>.
878
879 =head1 COPYRIGHT
880
881 This module is copyright (C) Charles Bailey, Tim Bunce and
882 David Landgren 1995-2007.  All rights reserved.
883
884 =head1 LICENSE
885
886 This library is free software; you can redistribute it and/or modify
887 it under the same terms as Perl itself.
888
889 =cut