brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 7fa1f93 Raw
67 lines · c
1//===-- MockSymlinkFileSystem.h2//--------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#include "lldb/Utility/FileSpec.h"11#include "llvm/Support/VirtualFileSystem.h"12 13namespace lldb_private {14 15// A mock file system that realpath's a given symlink to a given realpath.16class MockSymlinkFileSystem : public llvm::vfs::FileSystem {17public:18  // Treat all files as non-symlinks.19  MockSymlinkFileSystem() = default;20 21  /// Treat \a symlink as a symlink to \a realpath. Treat all other files as22  /// non-symlinks.23  MockSymlinkFileSystem(FileSpec &&symlink, FileSpec &&realpath,24                        FileSpec::Style style = FileSpec::Style::native)25      : m_symlink(std::move(symlink)), m_realpath(std::move(realpath)),26        m_style(style) {}27 28  /// If \a Path matches the symlink given in the ctor, put the realpath given29  /// in the ctor into \a Output.30  std::error_code getRealPath(const llvm::Twine &Path,31                              llvm::SmallVectorImpl<char> &Output) override {32    if (FileSpec(Path.str(), m_style) == m_symlink) {33      std::string path = m_realpath.GetPath();34      Output.assign(path.begin(), path.end());35    } else {36      Path.toVector(Output);37    }38    return {};39  }40 41  // Implement the rest of the interface42  llvm::ErrorOr<llvm::vfs::Status> status(const llvm::Twine &Path) override {43    return llvm::errc::operation_not_permitted;44  }45  llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>>46  openFileForRead(const llvm::Twine &Path) override {47    return llvm::errc::operation_not_permitted;48  }49  llvm::vfs::directory_iterator dir_begin(const llvm::Twine &Dir,50                                          std::error_code &EC) override {51    return llvm::vfs::directory_iterator();52  }53  std::error_code setCurrentWorkingDirectory(const llvm::Twine &Path) override {54    return llvm::errc::operation_not_permitted;55  }56  llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override {57    return llvm::errc::operation_not_permitted;58  }59 60private:61  FileSpec m_symlink;62  FileSpec m_realpath;63  FileSpec::Style m_style;64};65 66} // namespace lldb_private67