| //===-- FileSystemPosix.cpp -----------------------------------------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "lldb/Host/FileSystem.h" | 
 |  | 
 | // C includes | 
 | #include <dirent.h> | 
 | #include <fcntl.h> | 
 | #include <sys/mount.h> | 
 | #include <sys/param.h> | 
 | #include <sys/stat.h> | 
 | #include <sys/types.h> | 
 | #include <unistd.h> | 
 | #if defined(__NetBSD__) | 
 | #include <sys/statvfs.h> | 
 | #endif | 
 |  | 
 | // lldb Includes | 
 | #include "lldb/Host/Host.h" | 
 | #include "lldb/Utility/Status.h" | 
 | #include "lldb/Utility/StreamString.h" | 
 |  | 
 | #include "llvm/Support/Errno.h" | 
 | #include "llvm/Support/FileSystem.h" | 
 |  | 
 | using namespace lldb; | 
 | using namespace lldb_private; | 
 |  | 
 | const char *FileSystem::DEV_NULL = "/dev/null"; | 
 |  | 
 | Status FileSystem::Symlink(const FileSpec &src, const FileSpec &dst) { | 
 |   Status error; | 
 |   if (::symlink(dst.GetCString(), src.GetCString()) == -1) | 
 |     error.SetErrorToErrno(); | 
 |   return error; | 
 | } | 
 |  | 
 | Status FileSystem::Readlink(const FileSpec &src, FileSpec &dst) { | 
 |   Status error; | 
 |   char buf[PATH_MAX]; | 
 |   ssize_t count = ::readlink(src.GetPath().c_str(), buf, sizeof(buf) - 1); | 
 |   if (count < 0) | 
 |     error.SetErrorToErrno(); | 
 |   else { | 
 |     buf[count] = '\0'; // Success | 
 |     dst.SetFile(buf, FileSpec::Style::native); | 
 |   } | 
 |   return error; | 
 | } | 
 |  | 
 | Status FileSystem::ResolveSymbolicLink(const FileSpec &src, FileSpec &dst) { | 
 |   char resolved_path[PATH_MAX]; | 
 |   if (!src.GetPath(resolved_path, sizeof(resolved_path))) { | 
 |     return Status("Couldn't get the canonical path for %s", src.GetCString()); | 
 |   } | 
 |  | 
 |   char real_path[PATH_MAX + 1]; | 
 |   if (realpath(resolved_path, real_path) == nullptr) { | 
 |     Status err; | 
 |     err.SetErrorToErrno(); | 
 |     return err; | 
 |   } | 
 |  | 
 |   dst = FileSpec(real_path); | 
 |  | 
 |   return Status(); | 
 | } | 
 |  | 
 | FILE *FileSystem::Fopen(const char *path, const char *mode) { | 
 |   Collect(path); | 
 |   return llvm::sys::RetryAfterSignal(nullptr, ::fopen, path, mode); | 
 | } | 
 |  | 
 | int FileSystem::Open(const char *path, int flags, int mode) { | 
 |   Collect(path); | 
 |   return llvm::sys::RetryAfterSignal(-1, ::open, path, flags, mode); | 
 | } |