1*480093f4SDimitry Andric //===-- FileSystem.cpp ------------------------------------------*- C++ -*-===// 2*480093f4SDimitry Andric // 3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*480093f4SDimitry Andric // 7*480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8*480093f4SDimitry Andric 9*480093f4SDimitry Andric #include "lldb/Host/FileSystem.h" 10*480093f4SDimitry Andric 11*480093f4SDimitry Andric // C includes 12*480093f4SDimitry Andric #include <dirent.h> 13*480093f4SDimitry Andric #include <fcntl.h> 14*480093f4SDimitry Andric #include <sys/mount.h> 15*480093f4SDimitry Andric #include <sys/param.h> 16*480093f4SDimitry Andric #include <sys/stat.h> 17*480093f4SDimitry Andric #include <sys/types.h> 18*480093f4SDimitry Andric #include <unistd.h> 19*480093f4SDimitry Andric #if defined(__NetBSD__) 20*480093f4SDimitry Andric #include <sys/statvfs.h> 21*480093f4SDimitry Andric #endif 22*480093f4SDimitry Andric 23*480093f4SDimitry Andric // lldb Includes 24*480093f4SDimitry Andric #include "lldb/Host/Host.h" 25*480093f4SDimitry Andric #include "lldb/Utility/Status.h" 26*480093f4SDimitry Andric #include "lldb/Utility/StreamString.h" 27*480093f4SDimitry Andric 28*480093f4SDimitry Andric #include "llvm/Support/Errno.h" 29*480093f4SDimitry Andric #include "llvm/Support/FileSystem.h" 30*480093f4SDimitry Andric 31*480093f4SDimitry Andric using namespace lldb; 32*480093f4SDimitry Andric using namespace lldb_private; 33*480093f4SDimitry Andric 34*480093f4SDimitry Andric const char *FileSystem::DEV_NULL = "/dev/null"; 35*480093f4SDimitry Andric 36*480093f4SDimitry Andric Status FileSystem::Symlink(const FileSpec &src, const FileSpec &dst) { 37*480093f4SDimitry Andric Status error; 38*480093f4SDimitry Andric if (::symlink(dst.GetCString(), src.GetCString()) == -1) 39*480093f4SDimitry Andric error.SetErrorToErrno(); 40*480093f4SDimitry Andric return error; 41*480093f4SDimitry Andric } 42*480093f4SDimitry Andric 43*480093f4SDimitry Andric Status FileSystem::Readlink(const FileSpec &src, FileSpec &dst) { 44*480093f4SDimitry Andric Status error; 45*480093f4SDimitry Andric char buf[PATH_MAX]; 46*480093f4SDimitry Andric ssize_t count = ::readlink(src.GetCString(), buf, sizeof(buf) - 1); 47*480093f4SDimitry Andric if (count < 0) 48*480093f4SDimitry Andric error.SetErrorToErrno(); 49*480093f4SDimitry Andric else { 50*480093f4SDimitry Andric buf[count] = '\0'; // Success 51*480093f4SDimitry Andric dst.SetFile(buf, FileSpec::Style::native); 52*480093f4SDimitry Andric } 53*480093f4SDimitry Andric return error; 54*480093f4SDimitry Andric } 55*480093f4SDimitry Andric 56*480093f4SDimitry Andric Status FileSystem::ResolveSymbolicLink(const FileSpec &src, FileSpec &dst) { 57*480093f4SDimitry Andric char resolved_path[PATH_MAX]; 58*480093f4SDimitry Andric if (!src.GetPath(resolved_path, sizeof(resolved_path))) { 59*480093f4SDimitry Andric return Status("Couldn't get the canonical path for %s", src.GetCString()); 60*480093f4SDimitry Andric } 61*480093f4SDimitry Andric 62*480093f4SDimitry Andric char real_path[PATH_MAX + 1]; 63*480093f4SDimitry Andric if (realpath(resolved_path, real_path) == nullptr) { 64*480093f4SDimitry Andric Status err; 65*480093f4SDimitry Andric err.SetErrorToErrno(); 66*480093f4SDimitry Andric return err; 67*480093f4SDimitry Andric } 68*480093f4SDimitry Andric 69*480093f4SDimitry Andric dst = FileSpec(real_path); 70*480093f4SDimitry Andric 71*480093f4SDimitry Andric return Status(); 72*480093f4SDimitry Andric } 73*480093f4SDimitry Andric 74*480093f4SDimitry Andric FILE *FileSystem::Fopen(const char *path, const char *mode) { 75*480093f4SDimitry Andric return llvm::sys::RetryAfterSignal(nullptr, ::fopen, path, mode); 76*480093f4SDimitry Andric } 77*480093f4SDimitry Andric 78*480093f4SDimitry Andric int FileSystem::Open(const char *path, int flags, int mode) { 79*480093f4SDimitry Andric return llvm::sys::RetryAfterSignal(-1, ::open, path, flags, mode); 80*480093f4SDimitry Andric } 81