
1: /* help detect directory cycles efficiently 2: 3: Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc. 4: 5: This program is free software; you can redistribute it and/or modify 6: it under the terms of the GNU General Public License as published by 7: the Free Software Foundation; either version 2, or (at your option) 8: any later version. 9: 10: This program is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13: GNU General Public License for more details. 14: 15: You should have received a copy of the GNU General Public License 16: along with this program; see the file COPYING. 17: If not, write to the Free Software Foundation, 18: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19: 20: /* Written by Jim Meyering */ 21: 22: #ifndef CYCLE_CHECK_H 23: # define CYCLE_CHECK_H 1 24: 25: # include <stdint.h> 26: # include <stdbool.h> 27: # include "dev-ino.h" 28: # include "same-inode.h" 29: 30: struct cycle_check_state 31: { 32: struct dev_ino dev_ino; 33: uintmax_t chdir_counter; 34: int magic; 35: }; 36: 37: void cycle_check_init (struct cycle_check_state *state); 38: bool cycle_check (struct cycle_check_state *state, struct stat const *sb); 39: 40: # define CYCLE_CHECK_REFLECT_CHDIR_UP(State, SB_dir, SB_subdir) \ 41: do \ 42: { \ 43: /* You must call cycle_check at least once before using this macro. */ \ 44: if ((State)->chdir_counter == 0) \ 45: abort (); \ 46: if (SAME_INODE ((State)->dev_ino, SB_subdir)) \ 47: { \ 48: (State)->dev_ino.st_dev = (SB_dir).st_dev; \ 49: (State)->dev_ino.st_ino = (SB_dir).st_ino; \ 50: } \ 51: } \ 52: while (0) 53: 54: #endif