diff --git a/include/crucible/fd.h b/include/crucible/fd.h index f905812..6890417 100644 --- a/include/crucible/fd.h +++ b/include/crucible/fd.h @@ -57,6 +57,10 @@ namespace crucible { typedef ResourceHandle Fd; + static string __relative_path; + void set_relative_path(string path); + string relative_path(); + // Functions named "foo_or_die" throw exceptions on failure. // Attempt to open the file with the given mode diff --git a/lib/fd.cc b/lib/fd.cc index be6177b..257ed56 100644 --- a/lib/fd.cc +++ b/lib/fd.cc @@ -527,6 +527,22 @@ namespace crucible { THROW_ERROR(runtime_error, "readlink: maximum buffer size exceeded"); } + string + relative_path() + { + return __relative_path; + } + + void + set_relative_path(string path) + { + path = path + "/"; + for (string::size_type i = path.find("//"); i != string::npos; i = path.find("//")) { + path.erase(i, 1); + } + __relative_path = path; + } + // Turn a FD into a human-recognizable filename OR an error message. string name_fd(int fd) @@ -534,7 +550,12 @@ namespace crucible { try { ostringstream oss; oss << "/proc/self/fd/" << fd; - return readlink_or_die(oss.str()); + string path = readlink_or_die(oss.str()); + if (!__relative_path.empty() && 0 == path.find(__relative_path)) + { + path.erase(0, __relative_path.length()); + } + return path; } catch (exception &e) { return string(e.what()); }