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