X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffts_.h;h=0fb0f99ca2a82b0a14eaac30465c5e640142bf1f;hb=4cd8485e904c1a98470eb548fe6ac0f04e343c4e;hp=2843107ea2495c127850e4d99fab6867befaadd4;hpb=8b3f78cdd40155b5864692b63b6a368c7dabd050;p=gnulib.git diff --git a/lib/fts_.h b/lib/fts_.h index 2843107ea..0fb0f99ca 100644 --- a/lib/fts_.h +++ b/lib/fts_.h @@ -1,11 +1,11 @@ /* Traverse a file hierarchy. - Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2004-2008 Free Software Foundation, Inc. - 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 @@ -13,8 +13,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 . */ /* * Copyright (c) 1989, 1993 @@ -52,7 +51,6 @@ # ifdef _LIBC # include -# define _LGPL_PACKAGE 1 # else # undef __THROW # define __THROW @@ -65,6 +63,7 @@ # include # include # include +# include "i-ring.h" typedef struct { struct _ftsent *fts_cur; /* current node */ @@ -123,13 +122,25 @@ typedef struct { through the file descriptor member, fts_cwd_fd. */ # define FTS_CWDFD 0x0200 -# define FTS_OPTIONMASK 0x03ff /* valid user option mask */ + /* Historically, for each directory that fts initially encounters, it would + open it, read all entries, and stat each entry, storing the results, and + then it would process the first entry. But that behavior is bad for + locality of reference, and also causes trouble with inode-simulating + file systems like FAT, CIFS, FUSE-based ones, etc., when entries from + their name/inode cache are flushed too early. + Use this flag to make fts_open and fts_read defer the stat/lstat/fststat + of each entry until it is actually processed. However, note that if you + use this option and also specify a comparison function, that function may + not examine any data via fts_statp. */ +# define FTS_DEFER_STAT 0x0400 + +# define FTS_OPTIONMASK 0x07ff /* valid user option mask */ # define FTS_NAMEONLY 0x1000 /* (private) child names only */ # define FTS_STOP 0x2000 /* (private) unrecoverable error */ int fts_options; /* fts_open options, global flags */ -# if !_LGPL_PACKAGE +# if GNULIB_FTS union { /* This data structure is used if FTS_TIGHT_CYCLE_CHECK is specified. It records the directories between a starting @@ -151,7 +162,12 @@ typedef struct { but it's not appropriate for programs like du. */ struct cycle_check_state *state; } fts_cycle; + # endif + /* A stack of the file descriptors corresponding to the + most-recently traversed parent directories. + Currently used only in FTS_CWDFD mode. */ + I_ring fts_fd_ring; } FTS; typedef struct _ftsent {