From ca4fafb62cdc9a45a2077c5327a38805d8a4ea10 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Thu, 11 Feb 2016 20:50:38 -0500 Subject: [PATCH] filesystem::canonical --- cxx/filesystem.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/cxx/filesystem.cpp b/cxx/filesystem.cpp index e122d32..a02cfbb 100644 --- a/cxx/filesystem.cpp +++ b/cxx/filesystem.cpp @@ -286,4 +286,47 @@ namespace filesystem { syscall(ec, ::chdir, p.c_str()); } + + + + path canonical(const path& p, const path& base) { + error_code ec; + path rv = canonical(p, base, ec); + if (ec) + throw filesystem_error("filesystem::canonical", p, ec); + return rv; + } + + path canonical(const path& p, error_code& ec) { + char *cp; + char buffer[PATH_MAX]; + + ec.clear(); + cp = realpath(p.c_str(), buffer); + if (cp) return path(cp); + ec = error_code(errno, std::system_category()); + return path(); + } + + path canonical(const path& p, const path& base, error_code& ec) { + + char *cp; + char buffer[PATH_MAX]; + + ec.clear(); + + if (p.is_absolute()) cp = realpath(p.c_str(), buffer); + else { + path tmp = base; + tmp /= p; + cp = realpath(tmp.c_str(), buffer); + } + if (cp) return path(cp); + ec = error_code(errno, std::system_category()); + return path(); + } + + + + }