diff options
Diffstat (limited to 'libs/pbd/file_utils.cc')
-rw-r--r-- | libs/pbd/file_utils.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libs/pbd/file_utils.cc b/libs/pbd/file_utils.cc index f323ebcb69..31db84e88f 100644 --- a/libs/pbd/file_utils.cc +++ b/libs/pbd/file_utils.cc @@ -19,6 +19,9 @@ #include <algorithm> +#include <glib.h> +#include <glib/gstdio.h> + #include <glibmm/fileutils.h> #include <glibmm/miscutils.h> #include <glibmm/pattern.h> @@ -169,4 +172,39 @@ copy_files(const std::string & from_path, const std::string & to_dir) } } +std::string +get_absolute_path (const std::string & p) +{ + Glib::RefPtr<Gio::File> f = Gio::File::create_for_path (p); + return f->get_path (); +} + +bool +equivalent_paths (const std::string& a, const std::string& b) +{ + struct stat bA; + int const rA = g_stat (a.c_str(), &bA); + struct stat bB; + int const rB = g_stat (b.c_str(), &bB); + + return (rA == 0 && rB == 0 && bA.st_dev == bB.st_dev && bA.st_ino == bB.st_ino); +} + +bool +path_is_within (std::string const & haystack, std::string needle) +{ + while (1) { + if (equivalent_paths (haystack, needle)) { + return true; + } + + needle = Glib::path_get_dirname (needle); + if (needle == "." || needle == "/") { + break; + } + } + + return false; +} + } // namespace PBD |