15ffd83dbSDimitry Andric //===-- FileSystemPosix.cpp -----------------------------------------------===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric 9480093f4SDimitry Andric #include "lldb/Host/FileSystem.h" 10480093f4SDimitry Andric 11480093f4SDimitry Andric // C includes 12480093f4SDimitry Andric #include <dirent.h> 13480093f4SDimitry Andric #include <fcntl.h> 14480093f4SDimitry Andric #include <sys/mount.h> 15480093f4SDimitry Andric #include <sys/param.h> 16480093f4SDimitry Andric #include <sys/stat.h> 17480093f4SDimitry Andric #include <sys/types.h> 18480093f4SDimitry Andric #include <unistd.h> 19480093f4SDimitry Andric #if defined(__NetBSD__) 20480093f4SDimitry Andric #include <sys/statvfs.h> 21480093f4SDimitry Andric #endif 22480093f4SDimitry Andric 23480093f4SDimitry Andric // lldb Includes 24480093f4SDimitry Andric #include "lldb/Host/Host.h" 25480093f4SDimitry Andric #include "lldb/Utility/Status.h" 26480093f4SDimitry Andric #include "lldb/Utility/StreamString.h" 27480093f4SDimitry Andric 28480093f4SDimitry Andric #include "llvm/Support/Errno.h" 29480093f4SDimitry Andric #include "llvm/Support/FileSystem.h" 30480093f4SDimitry Andric 31480093f4SDimitry Andric using namespace lldb; 32480093f4SDimitry Andric using namespace lldb_private; 33480093f4SDimitry Andric 34480093f4SDimitry Andric const char *FileSystem::DEV_NULL = "/dev/null"; 35480093f4SDimitry Andric 36480093f4SDimitry Andric Status FileSystem::Symlink(const FileSpec &src, const FileSpec &dst) { 37480093f4SDimitry Andric Status error; 38*bdd1243dSDimitry Andric if (::symlink(dst.GetPath().c_str(), src.GetPath().c_str()) == -1) 39480093f4SDimitry Andric error.SetErrorToErrno(); 40480093f4SDimitry Andric return error; 41480093f4SDimitry Andric } 42480093f4SDimitry Andric 43480093f4SDimitry Andric Status FileSystem::Readlink(const FileSpec &src, FileSpec &dst) { 44480093f4SDimitry Andric Status error; 45480093f4SDimitry Andric char buf[PATH_MAX]; 465ffd83dbSDimitry Andric ssize_t count = ::readlink(src.GetPath().c_str(), buf, sizeof(buf) - 1); 47480093f4SDimitry Andric if (count < 0) 48480093f4SDimitry Andric error.SetErrorToErrno(); 49480093f4SDimitry Andric else { 50480093f4SDimitry Andric buf[count] = '\0'; // Success 51480093f4SDimitry Andric dst.SetFile(buf, FileSpec::Style::native); 52480093f4SDimitry Andric } 53480093f4SDimitry Andric return error; 54480093f4SDimitry Andric } 55480093f4SDimitry Andric 56480093f4SDimitry Andric Status FileSystem::ResolveSymbolicLink(const FileSpec &src, FileSpec &dst) { 57480093f4SDimitry Andric char resolved_path[PATH_MAX]; 58480093f4SDimitry Andric if (!src.GetPath(resolved_path, sizeof(resolved_path))) { 59*bdd1243dSDimitry Andric return Status("Couldn't get the canonical path for %s", 60*bdd1243dSDimitry Andric src.GetPath().c_str()); 61480093f4SDimitry Andric } 62480093f4SDimitry Andric 63480093f4SDimitry Andric char real_path[PATH_MAX + 1]; 64480093f4SDimitry Andric if (realpath(resolved_path, real_path) == nullptr) { 65480093f4SDimitry Andric Status err; 66480093f4SDimitry Andric err.SetErrorToErrno(); 67480093f4SDimitry Andric return err; 68480093f4SDimitry Andric } 69480093f4SDimitry Andric 70480093f4SDimitry Andric dst = FileSpec(real_path); 71480093f4SDimitry Andric 72480093f4SDimitry Andric return Status(); 73480093f4SDimitry Andric } 74480093f4SDimitry Andric 75480093f4SDimitry Andric FILE *FileSystem::Fopen(const char *path, const char *mode) { 76480093f4SDimitry Andric return llvm::sys::RetryAfterSignal(nullptr, ::fopen, path, mode); 77480093f4SDimitry Andric } 78480093f4SDimitry Andric 79480093f4SDimitry Andric int FileSystem::Open(const char *path, int flags, int mode) { 80480093f4SDimitry Andric return llvm::sys::RetryAfterSignal(-1, ::open, path, flags, mode); 81480093f4SDimitry Andric } 82