[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/File/ -> Path.pm (source)

   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.04';
  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 = grep {$^O eq $_} qw(amigaos dos epoc MSWin32 MacOS os2);
  30  
  31  sub _carp {
  32      require Carp;
  33      goto &Carp::carp;
  34  }
  35  
  36  sub _croak {
  37      require Carp;
  38      goto &Carp::croak;
  39  }
  40  
  41  sub _error {
  42      my $arg     = shift;
  43      my $message = shift;
  44      my $object  = shift;
  45  
  46      if ($arg->{error}) {
  47          $object = '' unless defined $object;
  48          push @{${$arg->{error}}}, {$object => "$message: $!"};
  49      }
  50      else {
  51          _carp(defined($object) ? "$message for $object: $!" : "$message: $!");
  52      }
  53  }
  54  
  55  sub mkpath {
  56      my $old_style = (
  57          UNIVERSAL::isa($_[0],'ARRAY')
  58          or (@_ == 2 and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1))
  59          or (@_ == 3
  60              and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1)
  61              and (defined $_[2] ? $_[2] =~ /\A\d+\z/ : 1)
  62          )
  63      ) ? 1 : 0;
  64  
  65      my $arg;
  66      my $paths;
  67  
  68      if ($old_style) {
  69          my ($verbose, $mode);
  70          ($paths, $verbose, $mode) = @_;
  71          $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
  72          $arg->{verbose} = defined $verbose ? $verbose : 0;
  73          $arg->{mode}    = defined $mode    ? $mode    : 0777;
  74      }
  75      else {
  76          if (@_ > 0 and UNIVERSAL::isa($_[-1], 'HASH')) {
  77              $arg = pop @_;
  78              exists $arg->{mask} and $arg->{mode} = delete $arg->{mask};
  79              $arg->{mode} = 0777 unless exists $arg->{mode};
  80              ${$arg->{error}} = [] if exists $arg->{error};
  81          }
  82          else {
  83              @{$arg}{qw(verbose mode)} = (0, 0777);
  84          }
  85          $paths = [@_];
  86      }
  87      return _mkpath($arg, $paths);
  88  }
  89  
  90  sub _mkpath {
  91      my $arg   = shift;
  92      my $paths = shift;
  93  
  94      local($")=$Is_MacOS ? ":" : "/";
  95      my(@created,$path);
  96      foreach $path (@$paths) {
  97          next unless length($path);
  98          $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT 
  99          # Logic wants Unix paths, so go with the flow.
 100          if ($Is_VMS) {
 101              next if $path eq '/';
 102              $path = VMS::Filespec::unixify($path);
 103          }
 104          next if -d $path;
 105          my $parent = File::Basename::dirname($path);
 106          unless (-d $parent or $path eq $parent) {
 107              push(@created,_mkpath($arg, [$parent]));
 108          }
 109          print "mkdir $path\n" if $arg->{verbose};
 110          if (mkdir($path,$arg->{mode})) {
 111              push(@created, $path);
 112          }
 113          else {
 114              my $save_bang = $!;
 115              my ($e, $e1) = ($save_bang, $^E);
 116              $e .= "; $e1" if $e ne $e1;
 117              # allow for another process to have created it meanwhile
 118              if (!-d $path) {
 119                  $! = $save_bang;
 120                  if ($arg->{error}) {
 121                      push @{${$arg->{error}}}, {$path => $e};
 122                  }
 123                  else {
 124                      _croak("mkdir $path: $e");
 125                  }
 126              }
 127          }
 128      }
 129      return @created;
 130  }
 131  
 132  sub rmtree {
 133      my $old_style = (
 134          UNIVERSAL::isa($_[0],'ARRAY')
 135          or (@_ == 2 and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1))
 136          or (@_ == 3
 137              and (defined $_[1] ? $_[1] =~ /\A\d+\z/ : 1)
 138              and (defined $_[2] ? $_[2] =~ /\A\d+\z/ : 1)
 139          )
 140      ) ? 1 : 0;
 141  
 142      my $arg;
 143      my $paths;
 144  
 145      if ($old_style) {
 146          my ($verbose, $safe);
 147          ($paths, $verbose, $safe) = @_;
 148          $arg->{verbose} = defined $verbose ? $verbose : 0;
 149          $arg->{safe}    = defined $safe    ? $safe    : 0;
 150  
 151          if (defined($paths) and length($paths)) {
 152              $paths = [$paths] unless UNIVERSAL::isa($paths,'ARRAY');
 153          }
 154          else {
 155              _carp ("No root path(s) specified\n");
 156              return 0;
 157          }
 158      }
 159      else {
 160          if (@_ > 0 and UNIVERSAL::isa($_[-1],'HASH')) {
 161              $arg = pop @_;
 162              ${$arg->{error}}  = [] if exists $arg->{error};
 163              ${$arg->{result}} = [] if exists $arg->{result};
 164          }
 165          else {
 166              @{$arg}{qw(verbose safe)} = (0, 0);
 167          }
 168          $paths = [@_];
 169      }
 170  
 171      $arg->{prefix} = '';
 172      $arg->{depth}  = 0;
 173  
 174      $arg->{cwd} = getcwd() or do {
 175          _error($arg, "cannot fetch initial working directory");
 176          return 0;
 177      };
 178      for ($arg->{cwd}) { /\A(.*)\Z/; $_ = $1 } # untaint
 179  
 180      @{$arg}{qw(device inode)} = (stat $arg->{cwd})[0,1] or do {
 181          _error($arg, "cannot stat initial working directory", $arg->{cwd});
 182          return 0;
 183      };
 184  
 185      return _rmtree($arg, $paths);
 186  }
 187  
 188  sub _rmtree {
 189      my $arg   = shift;
 190      my $paths = shift;
 191  
 192      my $count  = 0;
 193      my $curdir = File::Spec->curdir();
 194      my $updir  = File::Spec->updir();
 195  
 196      my (@files, $root);
 197      ROOT_DIR:
 198      foreach $root (@$paths) {
 199          if ($Is_MacOS) {
 200              $root  = ":$root" unless $root =~ /:/;
 201              $root .= ":"      unless $root =~ /:\z/;
 202          }
 203          else {
 204              $root =~ s{/\z}{};
 205          }
 206  
 207          # since we chdir into each directory, it may not be obvious
 208          # to figure out where we are if we generate a message about
 209          # a file name. We therefore construct a semi-canonical
 210          # filename, anchored from the directory being unlinked (as
 211          # opposed to being truly canonical, anchored from the root (/).
 212  
 213          my $canon = $arg->{prefix}
 214              ? File::Spec->catfile($arg->{prefix}, $root)
 215              : $root
 216          ;
 217  
 218          my ($ldev, $lino, $perm) = (lstat $root)[0,1,2] or next ROOT_DIR;
 219  
 220          if ( -d _ ) {
 221              $root = VMS::Filespec::pathify($root) if $Is_VMS;
 222              if (!chdir($root)) {
 223                  # see if we can escalate privileges to get in
 224                  # (e.g. funny protection mask such as -w- instead of rwx)
 225                  $perm &= 07777;
 226                  my $nperm = $perm | 0700;
 227                  if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $root))) {
 228                      _error($arg, "cannot make child directory read-write-exec", $canon);
 229                      next ROOT_DIR;
 230                  }
 231                  elsif (!chdir($root)) {
 232                      _error($arg, "cannot chdir to child", $canon);
 233                      next ROOT_DIR;
 234                  }
 235              }
 236  
 237              my ($device, $inode, $perm) = (stat $curdir)[0,1,2] or do {
 238                  _error($arg, "cannot stat current working directory", $canon);
 239                  next ROOT_DIR;
 240              };
 241  
 242              ($ldev eq $device and $lino eq $inode)
 243                  or _croak("directory $canon changed before chdir, expected dev=$ldev inode=$lino, actual dev=$device ino=$inode, aborting.");
 244  
 245              $perm &= 07777; # don't forget setuid, setgid, sticky bits
 246              my $nperm = $perm | 0700;
 247  
 248              # notabene: 0700 is for making readable in the first place,
 249              # it's also intended to change it to writable in case we have
 250              # to recurse in which case we are better than rm -rf for 
 251              # subtrees with strange permissions
 252  
 253              if (!($arg->{safe} or $nperm == $perm or chmod($nperm, $curdir))) {
 254                  _error($arg, "cannot make directory read+writeable", $canon);
 255                  $nperm = $perm;
 256              }
 257  
 258              my $d;
 259              $d = gensym() if $] < 5.006;
 260              if (!opendir $d, $curdir) {
 261                  _error($arg, "cannot opendir", $canon);
 262                  @files = ();
 263              }
 264              else {
 265                  no strict 'refs';
 266                  if (!defined ${"\cTAINT"} or ${"\cTAINT"}) {
 267                      # Blindly untaint dir names if taint mode is
 268                      # active, or any perl < 5.006
 269                      @files = map { /\A(.*)\z/s; $1 } readdir $d;
 270                  }
 271                  else {
 272                      @files = readdir $d;
 273                  }
 274                  closedir $d;
 275              }
 276  
 277              if ($Is_VMS) {
 278                  # Deleting large numbers of files from VMS Files-11
 279                  # filesystems is faster if done in reverse ASCIIbetical order.
 280                  # include '.' to '.;' from blead patch #31775
 281                  @files = map {$_ eq '.' ? '.;' : $_} reverse @files;
 282                  ($root = VMS::Filespec::unixify($root)) =~ s/\.dir\z//;
 283              }
 284              @files = grep {$_ ne $updir and $_ ne $curdir} @files;
 285  
 286              if (@files) {
 287                  # remove the contained files before the directory itself
 288                  my $narg = {%$arg};
 289                  @{$narg}{qw(device inode cwd prefix depth)}
 290                      = ($device, $inode, $updir, $canon, $arg->{depth}+1);
 291                  $count += _rmtree($narg, \@files);
 292              }
 293  
 294              # restore directory permissions of required now (in case the rmdir
 295              # below fails), while we are still in the directory and may do so
 296              # without a race via '.'
 297              if ($nperm != $perm and not chmod($perm, $curdir)) {
 298                  _error($arg, "cannot reset chmod", $canon);
 299              }
 300  
 301              # don't leave the client code in an unexpected directory
 302              chdir($arg->{cwd})
 303                  or _croak("cannot chdir to $arg->{cwd} from $canon: $!, aborting.");
 304  
 305              # ensure that a chdir upwards didn't take us somewhere other
 306              # than we expected (see CVE-2002-0435)
 307              ($device, $inode) = (stat $curdir)[0,1]
 308                  or _croak("cannot stat prior working directory $arg->{cwd}: $!, aborting.");
 309  
 310              ($arg->{device} eq $device and $arg->{inode} eq $inode)
 311                  or _croak("previous directory $arg->{cwd} changed before entering $canon, expected dev=$ldev inode=$lino, actual dev=$device ino=$inode, aborting.");
 312  
 313              if ($arg->{depth} or !$arg->{keep_root}) {
 314                  if ($arg->{safe} &&
 315                      ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) {
 316                      print "skipped $root\n" if $arg->{verbose};
 317                      next ROOT_DIR;
 318                  }
 319                  if (!chmod $perm | 0700, $root) {
 320                      if ($Force_Writeable) {
 321                          _error($arg, "cannot make directory writeable", $canon);
 322                      }
 323                  }
 324                  print "rmdir $root\n" if $arg->{verbose};
 325                  if (rmdir $root) {
 326                      push @{${$arg->{result}}}, $root if $arg->{result};
 327                      ++$count;
 328                  }
 329                  else {
 330                      _error($arg, "cannot remove directory", $canon);
 331                      if (!chmod($perm, ($Is_VMS ? VMS::Filespec::fileify($root) : $root))
 332                      ) {
 333                          _error($arg, sprintf("cannot restore permissions to 0%o",$perm), $canon);
 334                      }
 335                  }
 336              }
 337          }
 338          else {
 339              # not a directory
 340              $root = VMS::Filespec::vmsify("./$root")
 341                  if $Is_VMS 
 342                     && !File::Spec->file_name_is_absolute($root)
 343                     && ($root !~ m/(?<!\^)[\]>]+/);  # not already in VMS syntax
 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.04 of File::Path, released
 390  2007-11-13.
 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::Remove>
 852  
 853  Allows files and directories to be moved to the Trashcan/Recycle
 854  Bin (where they may later be restored if necessary) if the operating
 855  system supports such functionality. This feature may one day be
 856  made available directly in C<File::Path>.
 857  
 858  =item *
 859  
 860  L<File::Find::Rule>
 861  
 862  When removing directory trees, if you want to examine each file to
 863  decide whether to delete it (and possibly leaving large swathes
 864  alone), F<File::Find::Rule> offers a convenient and flexible approach
 865  to examining directory trees.
 866  
 867  =back
 868  
 869  =head1 BUGS
 870  
 871  Please report all bugs on the RT queue:
 872  
 873  L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=File-Path>
 874  
 875  =head1 ACKNOWLEDGEMENTS
 876  
 877  Paul Szabo identified the race condition originally, and Brendan
 878  O'Dea wrote an implementation for Debian that addressed the problem.
 879  That code was used as a basis for the current code. Their efforts
 880  are greatly appreciated.
 881  
 882  =head1 AUTHORS
 883  
 884  Tim Bunce <F<Tim.Bunce@ig.co.uk>> and Charles Bailey
 885  <F<bailey@newman.upenn.edu>>. Currently maintained by David Landgren
 886  <F<david@landgren.net>>.
 887  
 888  =head1 COPYRIGHT
 889  
 890  This module is copyright (C) Charles Bailey, Tim Bunce and
 891  David Landgren 1995-2007.  All rights reserved.
 892  
 893  =head1 LICENSE
 894  
 895  This library is free software; you can redistribute it and/or modify
 896  it under the same terms as Perl itself.
 897  
 898  =cut


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1