diff options
Diffstat (limited to 'lib/xfts.c')
-rw-r--r-- | lib/xfts.c | 61 |
1 files changed, 31 insertions, 30 deletions
@@ -1,11 +1,11 @@ /* xfts.c -- a wrapper for fts_open - Copyright (C) 2003, 2005-2007 Free Software Foundation, Inc. + Copyright (C) 2003-2016 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 <http://www.gnu.org/licenses/>. */ /* Written by Jim Meyering. */ @@ -22,13 +21,9 @@ #include <stdbool.h> #include <stdlib.h> +#include <errno.h> +#include <assert.h> -#include "error.h" - -#include "gettext.h" -#define _(msgid) gettext (msgid) - -#include "quote.h" #include "xalloc.h" #include "xfts.h" @@ -36,29 +31,35 @@ FTS * xfts_open (char * const *argv, int options, - int (*compar) (const FTSENT **, const FTSENT **)) + int (*compar) (const FTSENT **, const FTSENT **)) { FTS *fts = fts_open (argv, options | FTS_CWDFD, compar); if (fts == NULL) { - /* This can fail in three ways: out of memory, invalid bit_flags, - and one or more of the FILES is an empty string. We could try - to decipher that errno==EINVAL means invalid bit_flags and - errno==ENOENT means there's an empty string, but that seems wrong. - Ideally, fts_open would return a proper error indicator. For now, - we'll presume that the bit_flags are valid and just check for - empty strings. */ - bool invalid_arg = false; - for (; *argv; ++argv) - { - if (**argv == '\0') - invalid_arg = true; - } - if (invalid_arg) - error (EXIT_FAILURE, 0, _("invalid argument: %s"), quote ("")); - else - xalloc_die (); + /* This can fail in two ways: out of memory or with errno==EINVAL, + which indicates it was called with invalid bit_flags. */ + assert (errno != EINVAL); + xalloc_die (); } return fts; } + +/* When fts_read returns FTS_DC to indicate a directory cycle, + it may or may not indicate a real problem. When a program like + chgrp performs a recursive traversal that requires traversing + symbolic links, it is *not* a problem. However, when invoked + with "-P -R", it deserves a warning. The fts_options member + records the options that control this aspect of fts's behavior, + so test that. */ +bool +cycle_warning_required (FTS const *fts, FTSENT const *ent) +{ +#define ISSET(Fts,Opt) ((Fts)->fts_options & (Opt)) + /* When dereferencing no symlinks, or when dereferencing only + those listed on the command line and we're not processing + a command-line argument, then a cycle is a serious problem. */ + return ((ISSET (fts, FTS_PHYSICAL) && !ISSET (fts, FTS_COMFOLLOW)) + || (ISSET (fts, FTS_PHYSICAL) && ISSET (fts, FTS_COMFOLLOW) + && ent->fts_level != FTS_ROOTLEVEL)); +} |