1 /* help detect directory cycles efficiently 2 3 Copyright (C) 2003-2004, 2006, 2009-2021 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 3 of the License, or 8 (at your option) 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. If not, see <https://www.gnu.org/licenses/>. */ 17 18 /* Written by Jim Meyering */ 19 20 #ifndef CYCLE_CHECK_H 21 # define CYCLE_CHECK_H 1 22 23 # include <stdint.h> 24 # include <stdbool.h> 25 # include "dev-ino.h" 26 # include "same-inode.h" 27 28 struct cycle_check_state 29 { 30 struct dev_ino dev_ino; 31 uintmax_t chdir_counter; 32 int magic; 33 }; 34 35 void cycle_check_init (struct cycle_check_state *state); 36 bool cycle_check (struct cycle_check_state *state, struct stat const *sb); 37 38 # define CYCLE_CHECK_REFLECT_CHDIR_UP(State, SB_dir, SB_subdir) \ 39 do \ 40 { \ 41 /* You must call cycle_check at least once before using this macro. */ \ 42 if ((State)->chdir_counter == 0) \ 43 abort (); \ 44 if (SAME_INODE ((State)->dev_ino, SB_subdir)) \ 45 { \ 46 (State)->dev_ino.st_dev = (SB_dir).st_dev; \ 47 (State)->dev_ino.st_ino = (SB_dir).st_ino; \ 48 } \ 49 } \ 50 while (0) 51 52 #endif