[win32] support win32_select(0,0,0,msec) (winsock doesn't)
[p5sagit/p5-mst-13.2.git] / lib / File / Find.pm
index c5ce68c..1183506 100644 (file)
@@ -65,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);
@@ -74,20 +78,25 @@ that don't resolve:
 sub find {
     my $wanted = shift;
     my $cwd = Cwd::cwd();
-    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)) {
                ($dir,$_) = ($topdir,'.');
                $name = $topdir;
+               $prune = 0;
                &$wanted;
-               my $fixtopdir = $topdir;
-               $fixtopdir =~ s,/$,, ;
-               $fixtopdir =~ s/\.dir$// if $Is_VMS;
-               $fixtopdir =~ s/\\dir$// if $Is_NT;
-               &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";
@@ -146,7 +155,6 @@ sub finddir {
 
                    if (!$prune && chdir $_) {
                        $name =~ s/\.dir$// if $Is_VMS;
-                       $name =~ s/\\dir$// if $Is_NT;
                        &finddir($wanted,$name,$nlink);
                        chdir '..';
                    }
@@ -163,16 +171,18 @@ 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)) {
                my $fixtopdir = $topdir;
                $fixtopdir =~ s,/$,, ;
                $fixtopdir =~ s/\.dir$// if $Is_VMS;
-               $fixtopdir =~ s/\\dir$// if $Is_NT;
                &finddepthdir($wanted,$fixtopdir,$topnlink);
                ($dir,$_) = ($fixtopdir,'.');
                $name = $fixtopdir;
@@ -186,6 +196,7 @@ sub finddepth {
            unless (($_,$dir) = File::Basename::fileparse($topdir)) {
                ($dir,$_) = ('.', $topdir);
            }
+           $name = $topdir;
            chdir $dir && &$wanted;
        }
        chdir $cwd;
@@ -231,7 +242,6 @@ sub finddepthdir {
 
                    if (chdir $_) {
                        $name =~ s/\.dir$// if $Is_VMS;
-                       $name =~ s/\\dir$// if $Is_NT;
                        &finddepthdir($wanted,$name,$nlink);
                        chdir '..';
                    }
@@ -260,7 +270,7 @@ if ($^O =~ m:^mswin32:i) {
 }
 
 $dont_use_nlink = 1
-    if $^O eq 'os2' || $^O eq 'msdos' || $^O eq 'amigaos';
+    if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos';
 
 1;