diff options
Diffstat (limited to 'lib/cycle-check.c')
-rw-r--r-- | lib/cycle-check.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/lib/cycle-check.c b/lib/cycle-check.c deleted file mode 100644 index d8a3ca01d..000000000 --- a/lib/cycle-check.c +++ /dev/null @@ -1,89 +0,0 @@ -/* help detect directory cycles efficiently - - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. - - 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. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - If not, write to the Free Software Foundation, - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -/* Written by Jim Meyering */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <stdio.h> -#include <assert.h> -#include <stdlib.h> - -#include <stdbool.h> - -#include "cycle-check.h" - -#define CC_MAGIC 9827862 - -/* Return true if I is a power of 2, or is zero. */ - -static inline bool -is_zero_or_power_of_two (uintmax_t i) -{ - return (i & (i - 1)) == 0; -} - -void -cycle_check_init (struct cycle_check_state *state) -{ - state->chdir_counter = 0; - state->magic = CC_MAGIC; -} - -/* In traversing a directory hierarchy, call this function once for each - descending chdir call, with SB corresponding to the chdir operand. - If SB corresponds to a directory that has already been seen, - return true to indicate that there is a directory cycle. - Note that this is done `lazily', which means that some of - the directories in the cycle may be processed twice before - the cycle is detected. */ - -bool -cycle_check (struct cycle_check_state *state, struct stat const *sb) -{ - assert (state->magic == CC_MAGIC); - - /* If the current directory ever happens to be the same - as the one we last recorded for the cycle detection, - then it's obviously part of a cycle. */ - if (state->chdir_counter && SAME_INODE (*sb, state->dev_ino)) - return true; - - /* If the number of `descending' chdir calls is a power of two, - record the dev/ino of the current directory. */ - if (is_zero_or_power_of_two (++(state->chdir_counter))) - { - /* On all architectures that we know about, if the counter - overflows then there is a directory cycle here somewhere, - even if we haven't detected it yet. Typically this happens - only after the counter is incremented 2**64 times, so it's a - fairly theoretical point. */ - if (state->chdir_counter == 0) - return true; - - state->dev_ino.st_dev = sb->st_dev; - state->dev_ino.st_ino = sb->st_ino; - } - - return false; -} |