diff options
Diffstat (limited to 'recursive.cc')
-rw-r--r-- | recursive.cc | 22 |
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 ); |