mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-08-04 15:49:42 +02:00
(setup_dir, enter_dir, leave_dir, free_dir):
Use the hash-table-based cycle-detection code not just when FTS_TIGHT_CYCLE_CHECK if specified, but also with FTS_LOGICAL. Reported by James Youngman in <http://lists.gnu.org/archive/html/bug-gnulib/2005-08/msg00011.html>.
This commit is contained in:
+4
-4
@@ -50,7 +50,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 +74,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,7 +125,7 @@ enter_dir (FTS *fts, FTSENT *ent)
|
||||
static void
|
||||
leave_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 obj;
|
||||
@@ -144,7 +144,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);
|
||||
|
||||
Reference in New Issue
Block a user