xref: /openbmc/hiomapd/vpnor/test/tmpd.hpp (revision 261f61a1747a9ebf092d4f426e891ff94ad33ffc)
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