xref: /openbmc/phosphor-post-code-manager/src/post_code.cpp (revision 3a0444002398714c3a5539c93355c74eb184b2b1)
1 /*
2 // Copyright (c) 2019 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16 #include "post_code.hpp"
17 std::vector<uint64_t> PostCode::getPostCodes(uint16_t index)
18 {
19     std::vector<uint64_t> codes;
20 
21     if (currentBootCycleIndex() == index)
22         return postCodes;
23     deserializePostCodes(fs::path(strPostCodeListPath + std::to_string(index)),
24                          codes);
25     return codes;
26 }
27 void PostCode::savePostCodes(uint64_t code)
28 {
29     postCodes.push_back(code);
30     serialize(fs::path(PostCodeListPath));
31     return;
32 }
33 
34 fs::path PostCode::serialize(const std::string& path)
35 {
36     try
37     {
38         uint16_t index = currentBootCycleIndex();
39         fs::path fullPath(path + strCurrentBootCycleIndexName);
40         std::ofstream os(fullPath.c_str(), std::ios::binary);
41         cereal::JSONOutputArchive oarchive(os);
42         oarchive(index);
43 
44         std::ofstream osPostCodes(
45             (path + std::to_string(currentBootCycleIndex())).c_str(),
46             std::ios::binary);
47         cereal::JSONOutputArchive oarchivePostCodes(osPostCodes);
48         oarchivePostCodes(postCodes);
49     }
50     catch (cereal::Exception& e)
51     {
52         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
53         return "";
54     }
55     catch (const fs::filesystem_error& e)
56     {
57         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
58         return "";
59     }
60     return path;
61 }
62 
63 bool PostCode::deserialize(const fs::path& path, uint16_t& index)
64 {
65     try
66     {
67         if (fs::exists(path))
68         {
69             std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
70             cereal::JSONInputArchive iarchive(is);
71             iarchive(index);
72             return true;
73         }
74         return false;
75     }
76     catch (cereal::Exception& e)
77     {
78         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
79         return false;
80     }
81     catch (const fs::filesystem_error& e)
82     {
83         return false;
84     }
85 
86     return false;
87 }
88 
89 bool PostCode::deserializePostCodes(const fs::path& path,
90                                     std::vector<uint64_t>& codes)
91 {
92     try
93     {
94         if (fs::exists(path))
95         {
96             std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
97             cereal::JSONInputArchive iarchive(is);
98             iarchive(codes);
99             return true;
100         }
101         return false;
102     }
103     catch (cereal::Exception& e)
104     {
105         phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
106         return false;
107     }
108     catch (const fs::filesystem_error& e)
109     {
110         return false;
111     }
112 
113     return false;
114 }
115