8 #include <botan/exceptn.h>
9 #include <botan/internal/filesystem.h>
12 #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC)
14 #elif defined(BOTAN_HAS_BOOST_FILESYSTEM)
15 #include <boost/filesystem.hpp>
16 #elif defined(BOTAN_TARGET_OS_HAS_READDIR)
17 #include <sys/types.h>
29 #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC)
30 std::vector<std::string> impl_stl_filesystem(
const std::string& dir)
32 using namespace std::tr2::sys;
34 std::vector<std::string> out;
40 for (recursive_directory_iterator itr(p), end; itr != end; ++itr)
42 if (is_regular_file(itr->path()))
44 out.push_back(itr->path().string());
51 #elif defined(BOTAN_HAS_BOOST_FILESYSTEM)
52 std::vector<std::string> impl_boost_filesystem(
const std::string& dir_path)
54 namespace fs = boost::filesystem;
56 std::vector<std::string> out;
58 for(fs::recursive_directory_iterator dir(dir_path), end; dir != end; ++dir)
60 if(fs::is_regular_file(dir->path()))
62 out.push_back(dir->path().string());
68 #elif defined(BOTAN_TARGET_OS_HAS_READDIR)
69 std::vector<std::string> impl_readdir(
const std::string& dir_path)
71 std::vector<std::string> out;
72 std::deque<std::string> dir_list;
73 dir_list.push_back(dir_path);
75 while(!dir_list.empty())
77 const std::string cur_path = dir_list[0];
80 std::unique_ptr<DIR, std::function<int (DIR*)>> dir(::opendir(cur_path.c_str()), ::closedir);
84 while(
struct dirent* dirent = ::readdir(dir.get()))
86 const std::string filename = dirent->d_name;
87 if(filename ==
"." || filename ==
"..")
89 const std::string full_path = cur_path +
"/" + filename;
93 if(::stat(full_path.c_str(), &stat_buf) == -1)
96 if(S_ISDIR(stat_buf.st_mode))
97 dir_list.push_back(full_path);
98 else if(S_ISREG(stat_buf.st_mode))
99 out.push_back(full_path);
112 std::vector<std::string> files;
114 #if defined(BOTAN_TARGET_OS_HAS_STL_FILESYSTEM_MSVC) && defined(BOTAN_BUILD_COMPILER_IS_MSVC)
115 files = impl_stl_filesystem(dir);
116 #elif defined(BOTAN_HAS_BOOST_FILESYSTEM)
117 files = impl_boost_filesystem(dir);
118 #elif defined(BOTAN_TARGET_OS_HAS_READDIR)
119 files = impl_readdir(dir);
125 std::sort(files.begin(), files.end());
std::vector< std::string > get_files_recursive(const std::string &dir)