blob: 07530a88e849a1216d4faf67fa11d4f59991da1a [file] [log] [blame]
Varsha Kaverappa9eee2512022-10-28 02:46:25 -05001#include "file_io_type_vpd.hpp"
2
3#include "libpldm/base.h"
4#include "libpldm/file_io.h"
5
6#include "common/utils.hpp"
7
8#include <stdint.h>
9
10#include <iostream>
11
12typedef uint8_t byte;
13
14namespace pldm
15{
16namespace responder
17{
18int keywordHandler::read(uint32_t offset, uint32_t& length, Response& response,
19 oem_platform::Handler* /*oemPlatformHandler*/)
20{
21 const char* keywrdObjPath =
22 "/xyz/openbmc_project/inventory/system/chassis/motherboard";
23 const char* keywrdPropName = "PD_D";
24 const char* keywrdInterface = "com.ibm.ipzvpd.PSPD";
25
26 std::variant<std::vector<byte>> keywrd;
27
28 try
29 {
30 auto& bus = DBusHandler::getBus();
31 auto service = pldm::utils::DBusHandler().getService(keywrdObjPath,
32 keywrdInterface);
33 auto method =
34 bus.new_method_call(service.c_str(), keywrdObjPath,
35 "org.freedesktop.DBus.Properties", "Get");
36 method.append(keywrdInterface, keywrdPropName);
37 auto reply = bus.call(method);
38 reply.read(keywrd);
39 }
40 catch (const std::exception& e)
41 {
42 std::cerr << "Get keyword error from dbus interface : "
43 << keywrdInterface << " ERROR= " << e.what() << std::endl;
44 }
45
46 auto keywrdSize = std::get<std::vector<byte>>(keywrd).size();
47
48 if (length < keywrdSize)
49 {
50 std::cerr << "length requested is less the keyword size, length: "
51 << length << " keyword size: " << keywrdSize << std::endl;
52 return PLDM_ERROR_INVALID_DATA;
53 }
54
55 namespace fs = std::filesystem;
56 constexpr auto keywrdDirPath = "/tmp/pldm/";
57 constexpr auto keywrdFilePath = "/tmp/pldm/vpdKeywrd.bin";
58
59 if (!fs::exists(keywrdDirPath))
60 {
61 fs::create_directories(keywrdDirPath);
62 fs::permissions(keywrdDirPath,
63 fs::perms::others_read | fs::perms::owner_write);
64 }
65
66 std::ofstream keywrdFile("vpdKeywrd.bin");
67 keywrdFile.open(keywrdFilePath, std::ios::out | std::ofstream::binary);
68 if (!keywrdFile)
69 {
70 std::cerr << "VPD keyword file open error: " << keywrdFilePath
71 << " errno: " << errno << std::endl;
72 pldm::utils::reportError(
73 "xyz.openbmc_project.PLDM.Error.readKeywordHandler.keywordFileOpenError",
74 pldm::PelSeverity::ERROR);
75 return PLDM_ERROR;
76 }
77 keywrdFile.write((const char*)std::get<std::vector<byte>>(keywrd).data(),
78 keywrdSize);
79 if (keywrdFile.bad())
80 {
81 std::cerr << "Error while writing to file: " << keywrdFilePath
82 << std::endl;
83 }
84 keywrdFile.close();
85
86 // length of keyword data should be same as keyword data size in dbus object
87 length = (uint32_t)keywrdSize;
88
89 auto rc = readFile(keywrdFilePath, offset, keywrdSize, response);
90 fs::remove(keywrdFilePath);
91 if (rc)
92 {
93 std::cerr << "Read error for keyword file with size: " << keywrdSize
94 << std::endl;
95 pldm::utils::reportError(
96 "xyz.openbmc_project.PLDM.Error.readKeywordHandler.keywordFileReadError",
97 pldm::PelSeverity::ERROR);
98 return PLDM_ERROR;
99 }
100 return PLDM_SUCCESS;
101}
102} // namespace responder
103} // namespace pldm