[win32] support win32_select(0,0,0,msec) (winsock doesn't)
[p5sagit/p5-mst-13.2.git] / lib / File / Find.pm
index 02bacd8..1183506 100644 (file)
@@ -31,6 +31,9 @@ C<"$File::Find::dir/$_">.  You are chdir()'d to $File::Find::dir when
 the function is called.  The function may set $File::Find::prune to
 prune the tree.
 
+File::Find assumes that you don't alter the $_ variable.  If you do then
+make sure you return it to its original value before exiting your function.
+
 This library is primarily for the C<find2perl> tool, which when fed, 
 
     find2perl / -name .nfs\* -mtime +7 \
@@ -62,6 +65,10 @@ that don't resolve:
        -l && !-e && print "bogus link: $File::Find::name\n";
     } 
 
+=head1 BUGS
+
+There is no way to make find or finddepth follow symlinks.
+
 =cut
 
 @ISA = qw(Exporter);
@@ -70,27 +77,33 @@ that don't resolve:
 
 sub find {
     my $wanted = shift;
-    my $cwd = Cwd::fastcwd();
-    my ($topdir,$topdev,$topino,$topmode,$topnlink);
+    my $cwd = Cwd::cwd();
+    # Localize these rather than lexicalizing them for backwards
+    # compatibility.
+    local($topdir,$topdev,$topino,$topmode,$topnlink);
     foreach $topdir (@_) {
-       (($topdev,$topino,$topmode,$topnlink) = stat($topdir))
+       (($topdev,$topino,$topmode,$topnlink) =
+         ($Is_VMS ? stat($topdir) : lstat($topdir)))
          || (warn("Can't stat $topdir: $!\n"), next);
        if (-d _) {
            if (chdir($topdir)) {
                ($dir,$_) = ($topdir,'.');
                $name = $topdir;
+               $prune = 0;
                &$wanted;
-               my $fixtopdir = $topdir;
-               $fixtopdir =~ s,/$,, ;
-               $fixtopdir =~ s/\.dir$// if $Is_VMS; ;
-               &finddir($wanted,$fixtopdir,$topnlink);
+               if (!$prune) {
+                   my $fixtopdir = $topdir;
+                   $fixtopdir =~ s,/$,, ;
+                   $fixtopdir =~ s/\.dir$// if $Is_VMS;
+                   &finddir($wanted,$fixtopdir,$topnlink);
+               }
            }
            else {
                warn "Can't cd to $topdir: $!\n";
            }
        }
        else {
-           unless (($dir,$_) = File::Basename::fileparse($topdir)) {
+           unless (($_,$dir) = File::Basename::fileparse($topdir)) {
                ($dir,$_) = ('.', $topdir);
            }
            $name = $topdir;
@@ -158,9 +171,12 @@ sub finddepth {
 
     $cwd = Cwd::fastcwd();;
 
-    my($topdir, $topdev, $topino, $topmode, $topnlink);
+    # Localize these rather than lexicalizing them for backwards
+    # compatibility.
+    local($topdir, $topdev, $topino, $topmode, $topnlink);
     foreach $topdir (@_) {
-       (($topdev,$topino,$topmode,$topnlink) = stat($topdir))
+       (($topdev,$topino,$topmode,$topnlink) =
+         ($Is_VMS ? stat($topdir) : lstat($topdir)))
          || (warn("Can't stat $topdir: $!\n"), next);
        if (-d _) {
            if (chdir($topdir)) {
@@ -177,9 +193,10 @@ sub finddepth {
            }
        }
        else {
-           unless (($dir,$_) = File::Basename::fileparse($topdir)) {
+           unless (($_,$dir) = File::Basename::fileparse($topdir)) {
                ($dir,$_) = ('.', $topdir);
            }
+           $name = $topdir;
            chdir $dir && &$wanted;
        }
        chdir $cwd;
@@ -247,9 +264,13 @@ if ($^O eq 'VMS') {
   $Is_VMS = 1;
   $dont_use_nlink = 1;
 }
+if ($^O =~ m:^mswin32:i) {
+  $Is_NT = 1;
+  $dont_use_nlink = 1;
+}
 
-$dont_use_nlink = 1 if $^O eq 'os2';
-$dont_use_nlink = 1 if $^O =~ m:^mswin32$:i ;
+$dont_use_nlink = 1
+    if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos';
 
 1;