summaryrefslogtreecommitdiffstats
path: root/recursive.cc
diff options
context:
space:
mode:
Diffstat (limited to 'recursive.cc')
-rw-r--r--recursive.cc22
1 files changed, 15 insertions, 7 deletions
diff --git a/recursive.cc b/recursive.cc
index a6e9317..7b8810e 100644
--- a/recursive.cc
+++ b/recursive.cc
@@ -1,5 +1,5 @@
/* Lziprecover - Data recovery tool for the lzip format
- Copyright (C) 2023-2024 Antonio Diaz Diaz.
+ Copyright (C) 2023-2025 Antonio Diaz Diaz.
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
@@ -33,15 +33,14 @@
namespace {
-/* Return true if full_name is a regular file without extension .fec
- or (a link to) a directory. */
+// Return true if full_name is a regular file or (a link to) a directory.
bool test_full_name( const std::string & full_name, const struct stat * stp,
const bool follow )
{
struct stat st, st2;
if( ( follow && stat( full_name.c_str(), &st ) != 0 ) ||
( !follow && lstat( full_name.c_str(), &st ) != 0 ) ) return false;
- if( S_ISREG( st.st_mode ) ) return !has_fec_extension( full_name );
+ if( S_ISREG( st.st_mode ) ) return true;
if( !S_ISDIR( st.st_mode ) ) return false;
std::string prev_dir( full_name );
@@ -62,11 +61,21 @@ bool test_full_name( const std::string & full_name, const struct stat * stp,
return !loop; // (link to) directory
}
+
+bool ignore_name( const std::string & name )
+ {
+ if( name == "." || name == ".." || name == "fec" || name == "FEC" ||
+ has_fec_extension( name ) ) return true;
+ return name.size() > 3 && name.compare( name.size() - 3, 3, "fec" ) == 0 &&
+ ( name.end()[-4] == '-' || name.end()[-4] == '.' ||
+ name.end()[-4] == '_' );
+ }
+
} // end namespace
/* Return in input_filename the next file name. ('-' is a valid file name).
- Recursively found files and directories named "fec" are ignored.
+ Ignore recursively found files and directories named "fec" or "*[-._]fec".
Set 'retval' to 1 if a directory fails to open. */
bool next_filename( std::list< std::string > & filelist,
std::string & input_filename, int & retval,
@@ -105,8 +114,7 @@ bool next_filename( std::list< std::string > & filelist,
const struct dirent * const entryp = readdir( dirp );
if( !entryp ) { closedir( dirp ); break; }
const std::string tmp_name( entryp->d_name );
- if( tmp_name == "." || tmp_name == ".." || tmp_name == "fec" ||
- tmp_name == "FEC" ) continue;
+ if( ignore_name( tmp_name ) ) continue;
const std::string full_name( input_filename + tmp_name );
if( test_full_name( full_name, stdotp, recursive == 2 ) )
tmp_list.push_back( full_name );