diff options
Diffstat (limited to 'libs/pbd/filesystem.cc')
-rw-r--r-- | libs/pbd/filesystem.cc | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libs/pbd/filesystem.cc b/libs/pbd/filesystem.cc index a4bf781802..819a044a7b 100644 --- a/libs/pbd/filesystem.cc +++ b/libs/pbd/filesystem.cc @@ -254,6 +254,39 @@ get_absolute_path (const path & p) return f->get_path (); } +/** @return true if a and b have the same inode */ +bool +inodes_same (const path& a, const path& b) +{ + struct stat bA; + int const rA = stat (a.to_string().c_str(), &bA); + struct stat bB; + int const rB = stat (b.to_string().c_str(), &bB); + + return (rA == 0 && rB == 0 && bA.st_ino == bB.st_ino); +} + +/** Find out if `needle' is a file or directory within the + * directory `haystack'. + * @return true if it is. + */ +bool +path_is_within (path const & haystack, path needle) +{ + while (1) { + if (inodes_same (haystack, needle)) { + return true; + } + + needle = needle.branch_path (); + if (needle.to_string().empty() || needle.to_string() == "/") { + break; + } + } + + return false; +} + } // namespace sys } // namespace PBD |