130bcf84cSAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */ 230bcf84cSAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */ 330bcf84cSAndrew Jeffery 4d5f1d40fSWilliam A. Kennington III #include "config.h" 5d5f1d40fSWilliam A. Kennington III 6*261f61a1SAndrew Jeffery extern "C" { 7*261f61a1SAndrew Jeffery #include "mboxd.h" 8*261f61a1SAndrew Jeffery } 9*261f61a1SAndrew Jeffery 10d5f1d40fSWilliam A. Kennington III #include "vpnor/pnor_partition_table.hpp" 11d5f1d40fSWilliam A. Kennington III 12*261f61a1SAndrew Jeffery #include <cassert> 13*261f61a1SAndrew Jeffery #include <cstring> 14d5f1d40fSWilliam A. Kennington III #include <experimental/filesystem> 15d5f1d40fSWilliam A. Kennington III #include <fstream> 16d5f1d40fSWilliam A. Kennington III #include <vector> 17d5f1d40fSWilliam A. Kennington III 1830bcf84cSAndrew Jeffery namespace openpower 1930bcf84cSAndrew Jeffery { 2030bcf84cSAndrew Jeffery namespace virtual_pnor 2130bcf84cSAndrew Jeffery { 2230bcf84cSAndrew Jeffery namespace test 2330bcf84cSAndrew Jeffery { 2430bcf84cSAndrew Jeffery 2530bcf84cSAndrew Jeffery namespace fs = std::experimental::filesystem; 2630bcf84cSAndrew Jeffery 2730bcf84cSAndrew Jeffery class VpnorRoot 2830bcf84cSAndrew Jeffery { 2930bcf84cSAndrew Jeffery public: 3030bcf84cSAndrew Jeffery template <std::size_t N> 3130bcf84cSAndrew Jeffery VpnorRoot(struct mbox_context* ctx, const std::string (&toc)[N], 3230bcf84cSAndrew Jeffery size_t blockSize) 3330bcf84cSAndrew Jeffery { 3430bcf84cSAndrew Jeffery char tmplt[] = "/tmp/vpnor_root.XXXXXX"; 3530bcf84cSAndrew Jeffery char* tmpdir = mkdtemp(tmplt); 3630bcf84cSAndrew Jeffery root = fs::path{tmpdir}; 3730bcf84cSAndrew Jeffery 3830bcf84cSAndrew Jeffery for (const auto& attr : attributes) 3930bcf84cSAndrew Jeffery { 4030bcf84cSAndrew Jeffery fs::create_directory(root / attr); 4130bcf84cSAndrew Jeffery } 4230bcf84cSAndrew Jeffery 4330bcf84cSAndrew Jeffery fs::path tocFilePath = root / "ro" / PARTITION_TOC_FILE; 4430bcf84cSAndrew Jeffery 4530bcf84cSAndrew Jeffery for (const std::string& line : toc) 4630bcf84cSAndrew Jeffery { 4730bcf84cSAndrew Jeffery pnor_partition part; 4830bcf84cSAndrew Jeffery 4930bcf84cSAndrew Jeffery openpower::virtual_pnor::parseTocLine(line, blockSize, part); 5030bcf84cSAndrew Jeffery 5130bcf84cSAndrew Jeffery /* Populate the partition in the tree */ 5230bcf84cSAndrew Jeffery std::vector<char> zeroed(part.data.actual, 0); 5330bcf84cSAndrew Jeffery fs::path partitionFilePath = root / "ro" / part.data.name; 5430bcf84cSAndrew Jeffery std::ofstream(partitionFilePath) 5530bcf84cSAndrew Jeffery .write(zeroed.data(), zeroed.size()); 5630bcf84cSAndrew Jeffery 5730bcf84cSAndrew Jeffery /* Update the ToC if the partition file was created */ 5830bcf84cSAndrew Jeffery std::ofstream(tocFilePath, std::ofstream::app) << line << "\n"; 5930bcf84cSAndrew Jeffery } 6030bcf84cSAndrew Jeffery 6130bcf84cSAndrew Jeffery strncpy(ctx->paths.ro_loc, ro().c_str(), PATH_MAX - 1); 6230bcf84cSAndrew Jeffery ctx->paths.ro_loc[PATH_MAX - 1] = '\0'; 6330bcf84cSAndrew Jeffery strncpy(ctx->paths.rw_loc, rw().c_str(), PATH_MAX - 1); 6430bcf84cSAndrew Jeffery ctx->paths.rw_loc[PATH_MAX - 1] = '\0'; 6530bcf84cSAndrew Jeffery strncpy(ctx->paths.prsv_loc, prsv().c_str(), PATH_MAX - 1); 6630bcf84cSAndrew Jeffery ctx->paths.prsv_loc[PATH_MAX - 1] = '\0'; 6730bcf84cSAndrew Jeffery strncpy(ctx->paths.patch_loc, patch().c_str(), PATH_MAX - 1); 6830bcf84cSAndrew Jeffery ctx->paths.patch_loc[PATH_MAX - 1] = '\0'; 6930bcf84cSAndrew Jeffery } 7030bcf84cSAndrew Jeffery 7130bcf84cSAndrew Jeffery VpnorRoot(const VpnorRoot&) = delete; 7230bcf84cSAndrew Jeffery VpnorRoot& operator=(const VpnorRoot&) = delete; 7330bcf84cSAndrew Jeffery VpnorRoot(VpnorRoot&&) = delete; 7430bcf84cSAndrew Jeffery VpnorRoot& operator=(VpnorRoot&&) = delete; 7530bcf84cSAndrew Jeffery 7630bcf84cSAndrew Jeffery ~VpnorRoot() 7730bcf84cSAndrew Jeffery { 7830bcf84cSAndrew Jeffery fs::remove_all(root); 7930bcf84cSAndrew Jeffery } 8030bcf84cSAndrew Jeffery fs::path ro() 8130bcf84cSAndrew Jeffery { 8230bcf84cSAndrew Jeffery return fs::path{root} / "ro"; 8330bcf84cSAndrew Jeffery } 8430bcf84cSAndrew Jeffery fs::path rw() 8530bcf84cSAndrew Jeffery { 8630bcf84cSAndrew Jeffery return fs::path{root} / "rw"; 8730bcf84cSAndrew Jeffery } 8830bcf84cSAndrew Jeffery fs::path prsv() 8930bcf84cSAndrew Jeffery { 9030bcf84cSAndrew Jeffery return fs::path{root} / "prsv"; 9130bcf84cSAndrew Jeffery } 9230bcf84cSAndrew Jeffery fs::path patch() 9330bcf84cSAndrew Jeffery { 9430bcf84cSAndrew Jeffery return fs::path{root} / "patch"; 9530bcf84cSAndrew Jeffery } 9630bcf84cSAndrew Jeffery size_t write(const std::string& name, const void* data, size_t len); 9730bcf84cSAndrew Jeffery size_t patch(const std::string& name, const void* data, size_t len); 9830bcf84cSAndrew Jeffery 9930bcf84cSAndrew Jeffery private: 10030bcf84cSAndrew Jeffery fs::path root; 10130bcf84cSAndrew Jeffery const std::string attributes[4] = {"ro", "rw", "prsv", "patch"}; 10230bcf84cSAndrew Jeffery }; 10330bcf84cSAndrew Jeffery 1047a03b074SAndrew Jeffery } // namespace test 1057a03b074SAndrew Jeffery } // namespace virtual_pnor 1067a03b074SAndrew Jeffery } // namespace openpower 107