libutil: implement a realPath() utility
Just a wrapper around POSIX realpath(). Change-Id: I2593770285dbae573eace490efce5b272b00b001
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <sys/time.h>
|
||||
#include <cstdlib>
|
||||
#include <filesystem>
|
||||
#include <atomic>
|
||||
|
||||
@@ -106,6 +107,24 @@ Path canonPath(PathView path, bool resolveSymlinks)
|
||||
return s.empty() ? "/" : std::move(s);
|
||||
}
|
||||
|
||||
Path realPath(Path const & path)
|
||||
{
|
||||
// With nullptr, realpath() malloc's and returns a new c-string.
|
||||
char * resolved = realpath(path.c_str(), nullptr);
|
||||
int saved = errno;
|
||||
if (resolved == nullptr) {
|
||||
throw SysError(saved, "cannot get realpath for '%s'", path);
|
||||
}
|
||||
|
||||
Finally const _free([&] { free(resolved); });
|
||||
|
||||
// There's not really a from_raw_parts() for std::string.
|
||||
// The copy is not a big deal.
|
||||
Path ret(resolved);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void chmodPath(const Path & path, mode_t mode)
|
||||
{
|
||||
if (chmod(path.c_str(), mode) == -1)
|
||||
|
||||
Reference in New Issue
Block a user