diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2021-03-10 12:55:31 +0200 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2021-05-22 17:33:34 +0300 |
commit | 139a9d637084f928c3ed43ac6aad2178748ed8e4 (patch) | |
tree | 5df39ebfdb65a72d60e77501d71c6370d493e78f /drivers/unix | |
parent | 78861fde0b383e5fe361e73a451bf58ef117c20f (diff) |
Add symlink API to the DirAccess (on macOS and Linux).
Diffstat (limited to 'drivers/unix')
-rw-r--r-- | drivers/unix/dir_access_unix.cpp | 47 | ||||
-rw-r--r-- | drivers/unix/dir_access_unix.h | 4 |
2 files changed, 51 insertions, 0 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 3323da5db4..5abe5d2c87 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -406,6 +406,53 @@ Error DirAccessUnix::remove(String p_path) { } } +bool DirAccessUnix::is_link(String p_file) { + if (p_file.is_rel_path()) { + p_file = get_current_dir().plus_file(p_file); + } + + p_file = fix_path(p_file); + + struct stat flags; + if ((lstat(p_file.utf8().get_data(), &flags) != 0)) { + return FAILED; + } + + return S_ISLNK(flags.st_mode); +} + +String DirAccessUnix::read_link(String p_file) { + if (p_file.is_rel_path()) { + p_file = get_current_dir().plus_file(p_file); + } + + p_file = fix_path(p_file); + + char buf[256]; + memset(buf, 0, 256); + ssize_t len = readlink(p_file.utf8().get_data(), buf, sizeof(buf)); + String link; + if (len > 0) { + link.parse_utf8(buf, len); + } + return link; +} + +Error DirAccessUnix::create_link(String p_source, String p_target) { + if (p_target.is_rel_path()) { + p_target = get_current_dir().plus_file(p_target); + } + + p_source = fix_path(p_source); + p_target = fix_path(p_target); + + if (symlink(p_source.utf8().get_data(), p_target.utf8().get_data()) == 0) { + return OK; + } else { + return FAILED; + } +} + uint64_t DirAccessUnix::get_space_left() { #ifndef NO_STATVFS struct statvfs vfs; diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index 12994a6b76..28a7053d25 100644 --- a/drivers/unix/dir_access_unix.h +++ b/drivers/unix/dir_access_unix.h @@ -79,6 +79,10 @@ public: virtual Error rename(String p_path, String p_new_path); virtual Error remove(String p_path); + virtual bool is_link(String p_file); + virtual String read_link(String p_file); + virtual Error create_link(String p_source, String p_target); + virtual uint64_t get_space_left(); virtual String get_filesystem_type() const; |