void Carver::start() { // If status_ is not Ok, the creation of our tmp FS failed if (!status_.ok()) { LOG(WARNING) << "Carver has not been properly constructed"; return; } for (const auto& p : carvePaths_) { if (!fs::exists(p)) { VLOG(1) << "File does not exist on disk: " << p; } else { Status s = carve(p); if (!s.ok()) { VLOG(1) << "Failed to carve file: " << p; } } } std::set<fs::path> carvedFiles; for (const auto& p : platformGlob((carveDir_ / "*").string())) { carvedFiles.insert(fs::path(p)); } auto s = compress(carvedFiles); if (!s.ok()) { VLOG(1) << "Failed to create carve archive: " << s.getMessage(); updateCarveValue(carveGuid_, "status", "ARCHIVE FAILED"); return; } s = postCarve(archivePath_); if (!s.ok()) { VLOG(1) << "Failed to post carve: " << s.getMessage(); updateCarveValue(carveGuid_, "status", "DATA POST FAILED"); return; } };
static void genGlobs(std::string path, std::vector<std::string>& results, GlobLimits limits) { // Use our helped escape/replace for wildcards. replaceGlobWildcards(path, limits); // Generate a glob set and recurse for double star. size_t glob_index = 0; while (++glob_index < kMaxRecursiveGlobs) { auto glob_results = platformGlob(path); for (auto const& result_path : glob_results) { results.push_back(result_path); } // The end state is a non-recursive ending or empty set of matches. size_t wild = path.rfind("**"); // Allow a trailing slash after the double wild indicator. if (glob_results.size() == 0 || wild > path.size() || wild < path.size() - 3) { break; } path += "/**"; } // Prune results based on settings/requested glob limitations. auto end = std::remove_if( results.begin(), results.end(), [limits](const std::string& found) { return !(((found[found.length() - 1] == '/' || found[found.length() - 1] == '\\') && limits & GLOB_FOLDERS) || ((found[found.length() - 1] != '/' && found[found.length() - 1] != '\\') && limits & GLOB_FILES)); }); results.erase(end, results.end()); }
TEST_F(FileOpsTests, test_glob) { { std::vector<fs::path> expected{ kFakeDirectory + "/door.txt", kFakeDirectory + "/root.txt", kFakeDirectory + "/root2.txt", kFakeDirectory + "/roto.txt"}; auto result = platformGlob(kFakeDirectory + "/*.txt"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{ kFakeDirectory + "/deep1/", kFakeDirectory + "/deep11/", kFakeDirectory + "/door.txt", kFakeDirectory + "/root.txt", kFakeDirectory + "/root2.txt", kFakeDirectory + "/roto.txt"}; auto result = platformGlob(kFakeDirectory + "/*"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep1/deep2/", kFakeDirectory + "/deep1/level1.txt", kFakeDirectory + "/deep11/deep2/", kFakeDirectory + "/deep11/level1.txt", kFakeDirectory + "/deep11/not_bash"}; auto result = platformGlob(kFakeDirectory + "/*/*"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep1/deep2/level2.txt", kFakeDirectory + "/deep11/deep2/deep3/", kFakeDirectory + "/deep11/deep2/level2.txt"}; auto result = platformGlob(kFakeDirectory + "/*/*/*"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep11/deep2/deep3/", kFakeDirectory + "/deep11/deep2/level2.txt"}; auto result = platformGlob(kFakeDirectory + "/*11/*/*"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep1/", kFakeDirectory + "/root.txt"}; auto result = platformGlob(kFakeDirectory + "/{deep,root}{1,.txt}"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep1/deep2/level2.txt", kFakeDirectory + "/deep11/deep2/deep3/", kFakeDirectory + "/deep11/deep2/level2.txt"}; auto result = platformGlob(kFakeDirectory + "/*/deep2/*"); EXPECT_TRUE(globResultsMatch(result, expected)); } { std::vector<fs::path> expected{kFakeDirectory + "/deep1/deep2/", #ifdef WIN32 kFakeDirectory + "/deep1/level1.txt", kFakeDirectory + "/deep11/deep2/", #else kFakeDirectory + "/deep11/deep2/", kFakeDirectory + "/deep1/level1.txt", #endif kFakeDirectory + "/deep11/level1.txt", kFakeDirectory + "/deep11/not_bash"}; auto result = platformGlob(kFakeDirectory + "/*/{deep2,level1,not_bash}{,.txt}"); EXPECT_TRUE(globResultsMatch(result, expected)); } }