blob: 38de0e4124bc6c899c6d55e83de0ea8786b51f0a [file] [log] [blame]
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05001#include "utils.hpp"
2
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -06003#include <unistd.h>
4
Patrick Williamsc9bb6422021-08-27 06:18:35 -05005#include <phosphor-logging/lg2.hpp>
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05006
Jayashankar Padatha0135602019-04-22 16:22:58 +05307namespace utils
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05008{
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05009
Patrick Williamsc9bb6422021-08-27 06:18:35 -050010PHOSPHOR_LOG2_USING;
Jayashankar Padatha0135602019-04-22 16:22:58 +053011
12std::string getService(sdbusplus::bus::bus& bus, const std::string& path,
13 const std::string& interface)
14{
15 auto method = bus.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
16 MAPPER_BUSNAME, "GetObject");
17
18 method.append(path);
19 method.append(std::vector<std::string>({interface}));
20
21 std::vector<std::pair<std::string, std::vector<std::string>>> response;
22
23 try
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050024 {
Jayashankar Padatha0135602019-04-22 16:22:58 +053025 auto reply = bus.call(method);
26 reply.read(response);
27 if (response.empty())
28 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050029 error(
30 "Empty response from mapper for getting service name: {PATH} {INTERFACE}",
31 "PATH", path, "INTERFACE", interface);
Jayashankar Padatha0135602019-04-22 16:22:58 +053032 return std::string{};
33 }
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050034 }
Patrick Williams4ce901c2021-09-02 09:34:45 -050035 catch (const sdbusplus::exception::exception& e)
Jayashankar Padatha0135602019-04-22 16:22:58 +053036 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050037 error("Error in mapper method call for ({PATH}, {INTERFACE}: {ERROR}",
38 "ERROR", e, "PATH", path, "INTERFACE", interface);
Jayashankar Padatha0135602019-04-22 16:22:58 +053039 return std::string{};
40 }
41 return response[0].first;
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050042}
43
George Liu0a06e972020-12-17 09:17:04 +080044void mergeFiles(std::vector<std::string>& srcFiles, std::string& dstFile)
45{
46 std::ofstream outFile(dstFile, std::ios::out);
47 for (auto& file : srcFiles)
48 {
49 std::ifstream inFile;
50 inFile.open(file, std::ios_base::in);
51 if (!inFile)
52 {
53 continue;
54 }
55
56 inFile.peek();
57 if (inFile.eof())
58 {
59 inFile.close();
60 continue;
61 }
62
63 outFile << inFile.rdbuf();
64 inFile.close();
65 }
66 outFile.close();
67}
68
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060069namespace internal
70{
71
72/* @brief Helper function to build a string from command arguments */
73static std::string buildCommandStr(const char* name, char** args)
74{
75 std::string command = name;
76 for (int i = 0; args[i]; i++)
77 {
78 command += " ";
79 command += args[i];
80 }
81 return command;
82}
83
84int executeCmd(const char* path, char** args)
85{
86 pid_t pid = fork();
87 if (pid == 0)
88 {
89 execv(path, args);
90
Patrick Williamsc9bb6422021-08-27 06:18:35 -050091 // execv only retruns on err
92 auto err = errno;
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060093 auto command = buildCommandStr(path, args);
Patrick Williamsc9bb6422021-08-27 06:18:35 -050094 error("Failed ({ERRNO}) to execute command: {COMMAND}", "ERRNO", err,
95 "COMMAND", command);
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060096 return -1;
97 }
98 else if (pid > 0)
99 {
100 int status;
101 if (waitpid(pid, &status, 0) < 0)
102 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500103 error("Error ({ERRNO}) during waitpid.", "ERRNO", errno);
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600104 return -1;
105 }
106 else if (WEXITSTATUS(status) != 0)
107 {
108 auto command = buildCommandStr(path, args);
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500109 error("Error ({STATUS}) occurred when executing command: {COMMAND}",
110 "STATUS", status, "COMMAND", command);
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600111 return -1;
112 }
113 }
114 else
115 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -0500116 error("Error ({ERRNO}) during fork.", "ERRNO", errno);
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600117 return -1;
118 }
119
120 return 0;
121}
122
123} // namespace internal
124
Jayashankar Padatha0135602019-04-22 16:22:58 +0530125} // namespace utils