Avoid a compilation warning.
[gnulib.git] / lib / fts-cycle.c
index 0fb1a03..5f81610 100644 (file)
@@ -1,13 +1,13 @@
 /* Detect cycles in file tree walks.
 
-   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    Written by Jim Meyering.
 
-   This program is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,8 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "cycle-check.h"
 #include "hash.h"
@@ -50,7 +49,7 @@ AD_hash (void const *x, size_t table_size)
 static bool
 setup_dir (FTS *fts)
 {
-  if (fts->fts_options & FTS_TIGHT_CYCLE_CHECK)
+  if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
     {
       enum { HT_INITIAL_SIZE = 31 };
       fts->fts_cycle.ht = hash_initialize (HT_INITIAL_SIZE, NULL, AD_hash,
@@ -74,7 +73,7 @@ setup_dir (FTS *fts)
 static bool
 enter_dir (FTS *fts, FTSENT *ent)
 {
-  if (fts->fts_options & FTS_TIGHT_CYCLE_CHECK)
+  if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
     {
       struct stat const *st = ent->fts_statp;
       struct Active_dir *ad = malloc (sizeof *ad);
@@ -125,9 +124,9 @@ enter_dir (FTS *fts, FTSENT *ent)
 static void
 leave_dir (FTS *fts, FTSENT *ent)
 {
-  if (fts->fts_options & FTS_TIGHT_CYCLE_CHECK)
+  struct stat const *st = ent->fts_statp;
+  if (fts->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
     {
-      struct stat const *st = ent->fts_statp;
       struct Active_dir obj;
       void *found;
       obj.dev = st->st_dev;
@@ -137,6 +136,13 @@ leave_dir (FTS *fts, FTSENT *ent)
        abort ();
       free (found);
     }
+  else
+    {
+      FTSENT *parent = ent->fts_parent;
+      if (parent != NULL && 0 <= parent->fts_level)
+       CYCLE_CHECK_REFLECT_CHDIR_UP (fts->fts_cycle.state,
+                                     *(parent->fts_statp), *st);
+    }
 }
 
 /* Free any memory used for cycle detection.  */
@@ -144,7 +150,7 @@ leave_dir (FTS *fts, FTSENT *ent)
 static void
 free_dir (FTS *sp)
 {
-  if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK)
+  if (sp->fts_options & (FTS_TIGHT_CYCLE_CHECK | FTS_LOGICAL))
     {
       if (sp->fts_cycle.ht)
        hash_free (sp->fts_cycle.ht);