This patch removes the ability to instantiate the LLDB FileSystem class with a FileCollector. It keeps the ability to collect files, but uses the FileCollectorFileSystem to do that transparently. Because the two are intertwined, this patch also removes the finalization logic which copied the files over out of process.
81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
//===-- 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) {
|
|
return llvm::sys::RetryAfterSignal(nullptr, ::fopen, path, mode);
|
|
}
|
|
|
|
int FileSystem::Open(const char *path, int flags, int mode) {
|
|
return llvm::sys::RetryAfterSignal(-1, ::open, path, flags, mode);
|
|
}
|