aboutsummaryrefslogtreecommitdiff
path: root/src/posix_extras.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/posix_extras.cc')
-rw-r--r--src/posix_extras.cc18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/posix_extras.cc b/src/posix_extras.cc
index e7705a7..11db247 100644
--- a/src/posix_extras.cc
+++ b/src/posix_extras.cc
@@ -125,6 +125,19 @@ std::vector<std::uint8_t> File::Read(off_t offset, size_t bytes) const {
return result;
}
+std::string File::ReadLinkAt(const char* const path) const {
+ ValidatePath(path);
+ std::vector<char> result(64, '\0');
+ size_t bytes_read;
+
+ while ((bytes_read = static_cast<size_t>(CheckSyscall(readlinkat(
+ fd_, path, result.data(), result.size())))) == result.size()) {
+ // We filled the entire buffer. There may be more data we missed.
+ result.resize(result.size() * 2);
+ }
+ return std::string(result.data(), result.data() + bytes_read);
+}
+
void File::RenameAt(const char* old_path, const char* new_path) const {
ValidatePath(old_path);
ValidatePath(new_path);
@@ -136,6 +149,11 @@ void File::RmDirAt(const char* const path) const {
CheckSyscall(unlinkat(fd_, path, AT_REMOVEDIR));
}
+void File::SymLinkAt(const char* const target, const char* const source) const {
+ ValidatePath(source);
+ CheckSyscall(symlinkat(target, fd_, source));
+}
+
void File::UnlinkAt(const char* const path) const {
ValidatePath(path);
CheckSyscall(unlinkat(fd_, path, 0));