1*30bcf84cSAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */ 2*30bcf84cSAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */ 3*30bcf84cSAndrew Jeffery 4*30bcf84cSAndrew Jeffery #include <assert.h> 5*30bcf84cSAndrew Jeffery #include <string.h> 6*30bcf84cSAndrew Jeffery #include <vector> 7*30bcf84cSAndrew Jeffery #include <fstream> 8*30bcf84cSAndrew Jeffery #include <experimental/filesystem> 9*30bcf84cSAndrew Jeffery 10*30bcf84cSAndrew Jeffery #include "config.h" 11*30bcf84cSAndrew Jeffery #include "mbox.h" 12*30bcf84cSAndrew Jeffery #include "vpnor/pnor_partition_table.hpp" 13*30bcf84cSAndrew Jeffery 14*30bcf84cSAndrew Jeffery namespace openpower 15*30bcf84cSAndrew Jeffery { 16*30bcf84cSAndrew Jeffery namespace virtual_pnor 17*30bcf84cSAndrew Jeffery { 18*30bcf84cSAndrew Jeffery namespace test 19*30bcf84cSAndrew Jeffery { 20*30bcf84cSAndrew Jeffery 21*30bcf84cSAndrew Jeffery namespace fs = std::experimental::filesystem; 22*30bcf84cSAndrew Jeffery 23*30bcf84cSAndrew Jeffery class VpnorRoot 24*30bcf84cSAndrew Jeffery { 25*30bcf84cSAndrew Jeffery public: 26*30bcf84cSAndrew Jeffery template <std::size_t N> 27*30bcf84cSAndrew Jeffery VpnorRoot(struct mbox_context* ctx, const std::string (&toc)[N], 28*30bcf84cSAndrew Jeffery size_t blockSize) 29*30bcf84cSAndrew Jeffery { 30*30bcf84cSAndrew Jeffery char tmplt[] = "/tmp/vpnor_root.XXXXXX"; 31*30bcf84cSAndrew Jeffery char* tmpdir = mkdtemp(tmplt); 32*30bcf84cSAndrew Jeffery root = fs::path{tmpdir}; 33*30bcf84cSAndrew Jeffery 34*30bcf84cSAndrew Jeffery for (const auto& attr : attributes) 35*30bcf84cSAndrew Jeffery { 36*30bcf84cSAndrew Jeffery fs::create_directory(root / attr); 37*30bcf84cSAndrew Jeffery } 38*30bcf84cSAndrew Jeffery 39*30bcf84cSAndrew Jeffery fs::path tocFilePath = root / "ro" / PARTITION_TOC_FILE; 40*30bcf84cSAndrew Jeffery 41*30bcf84cSAndrew Jeffery for (const std::string& line : toc) 42*30bcf84cSAndrew Jeffery { 43*30bcf84cSAndrew Jeffery pnor_partition part; 44*30bcf84cSAndrew Jeffery 45*30bcf84cSAndrew Jeffery openpower::virtual_pnor::parseTocLine(line, blockSize, part); 46*30bcf84cSAndrew Jeffery 47*30bcf84cSAndrew Jeffery /* Populate the partition in the tree */ 48*30bcf84cSAndrew Jeffery std::vector<char> zeroed(part.data.actual, 0); 49*30bcf84cSAndrew Jeffery fs::path partitionFilePath = root / "ro" / part.data.name; 50*30bcf84cSAndrew Jeffery std::ofstream(partitionFilePath) 51*30bcf84cSAndrew Jeffery .write(zeroed.data(), zeroed.size()); 52*30bcf84cSAndrew Jeffery 53*30bcf84cSAndrew Jeffery /* Update the ToC if the partition file was created */ 54*30bcf84cSAndrew Jeffery std::ofstream(tocFilePath, std::ofstream::app) << line << "\n"; 55*30bcf84cSAndrew Jeffery } 56*30bcf84cSAndrew Jeffery 57*30bcf84cSAndrew Jeffery strncpy(ctx->paths.ro_loc, ro().c_str(), PATH_MAX - 1); 58*30bcf84cSAndrew Jeffery ctx->paths.ro_loc[PATH_MAX - 1] = '\0'; 59*30bcf84cSAndrew Jeffery strncpy(ctx->paths.rw_loc, rw().c_str(), PATH_MAX - 1); 60*30bcf84cSAndrew Jeffery ctx->paths.rw_loc[PATH_MAX - 1] = '\0'; 61*30bcf84cSAndrew Jeffery strncpy(ctx->paths.prsv_loc, prsv().c_str(), PATH_MAX - 1); 62*30bcf84cSAndrew Jeffery ctx->paths.prsv_loc[PATH_MAX - 1] = '\0'; 63*30bcf84cSAndrew Jeffery strncpy(ctx->paths.patch_loc, patch().c_str(), PATH_MAX - 1); 64*30bcf84cSAndrew Jeffery ctx->paths.patch_loc[PATH_MAX - 1] = '\0'; 65*30bcf84cSAndrew Jeffery } 66*30bcf84cSAndrew Jeffery 67*30bcf84cSAndrew Jeffery VpnorRoot(const VpnorRoot&) = delete; 68*30bcf84cSAndrew Jeffery VpnorRoot& operator=(const VpnorRoot&) = delete; 69*30bcf84cSAndrew Jeffery VpnorRoot(VpnorRoot&&) = delete; 70*30bcf84cSAndrew Jeffery VpnorRoot& operator=(VpnorRoot&&) = delete; 71*30bcf84cSAndrew Jeffery 72*30bcf84cSAndrew Jeffery ~VpnorRoot() 73*30bcf84cSAndrew Jeffery { 74*30bcf84cSAndrew Jeffery fs::remove_all(root); 75*30bcf84cSAndrew Jeffery } 76*30bcf84cSAndrew Jeffery fs::path ro() 77*30bcf84cSAndrew Jeffery { 78*30bcf84cSAndrew Jeffery return fs::path{root} / "ro"; 79*30bcf84cSAndrew Jeffery } 80*30bcf84cSAndrew Jeffery fs::path rw() 81*30bcf84cSAndrew Jeffery { 82*30bcf84cSAndrew Jeffery return fs::path{root} / "rw"; 83*30bcf84cSAndrew Jeffery } 84*30bcf84cSAndrew Jeffery fs::path prsv() 85*30bcf84cSAndrew Jeffery { 86*30bcf84cSAndrew Jeffery return fs::path{root} / "prsv"; 87*30bcf84cSAndrew Jeffery } 88*30bcf84cSAndrew Jeffery fs::path patch() 89*30bcf84cSAndrew Jeffery { 90*30bcf84cSAndrew Jeffery return fs::path{root} / "patch"; 91*30bcf84cSAndrew Jeffery } 92*30bcf84cSAndrew Jeffery size_t write(const std::string& name, const void* data, size_t len); 93*30bcf84cSAndrew Jeffery size_t patch(const std::string& name, const void* data, size_t len); 94*30bcf84cSAndrew Jeffery 95*30bcf84cSAndrew Jeffery private: 96*30bcf84cSAndrew Jeffery fs::path root; 97*30bcf84cSAndrew Jeffery const std::string attributes[4] = {"ro", "rw", "prsv", "patch"}; 98*30bcf84cSAndrew Jeffery }; 99*30bcf84cSAndrew Jeffery 100*30bcf84cSAndrew Jeffery } // test 101*30bcf84cSAndrew Jeffery } // virtual_pnor 102*30bcf84cSAndrew Jeffery } // openpower 103