blob: 204affac37ecf1ca2ae4a66fafdc488c39f7f72d [file] [log] [blame]
#include "utils.hpp"
#include <unistd.h>
#include <phosphor-logging/lg2.hpp>
namespace utils
{
PHOSPHOR_LOG2_USING;
std::string getService(sdbusplus::bus_t& bus, const std::string& path,
const std::string& interface)
{
auto method = bus.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
MAPPER_BUSNAME, "GetObject");
method.append(path);
method.append(std::vector<std::string>({interface}));
std::vector<std::pair<std::string, std::vector<std::string>>> response;
try
{
auto reply = bus.call(method);
reply.read(response);
if (response.empty())
{
error(
"Empty response from mapper for getting service name: {PATH} {INTERFACE}",
"PATH", path, "INTERFACE", interface);
return std::string{};
}
}
catch (const sdbusplus::exception_t& e)
{
error("Error in mapper method call for ({PATH}, {INTERFACE}: {ERROR}",
"ERROR", e, "PATH", path, "INTERFACE", interface);
return std::string{};
}
return response[0].first;
}
void setProperty(sdbusplus::bus_t& bus, const std::string& objectPath,
const std::string& interface, const std::string& propertyName,
const PropertyValue& value)
{
auto service = getService(bus, objectPath, interface);
if (service.empty())
{
return;
}
auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
"org.freedesktop.DBus.Properties", "Set");
method.append(interface.c_str(), propertyName.c_str(), value);
bus.call_noreply(method);
}
void mergeFiles(const std::vector<std::string>& srcFiles,
const std::string& dstFile)
{
std::ofstream outFile(dstFile, std::ios::out);
for (const auto& file : srcFiles)
{
std::ifstream inFile;
inFile.open(file, std::ios_base::in);
if (!inFile)
{
continue;
}
inFile.peek();
if (inFile.eof())
{
inFile.close();
continue;
}
outFile << inFile.rdbuf();
inFile.close();
}
outFile.close();
}
namespace internal
{
/* @brief Helper function to build a string from command arguments */
static std::string buildCommandStr(char** args)
{
std::string command = "";
for (int i = 0; args[i]; i++)
{
command += args[i];
command += " ";
}
return command;
}
std::pair<int, std::string> executeCmd(char** args)
{
std::array<char, 512> buffer;
std::string cmd = buildCommandStr(args);
std::stringstream result;
int rc;
FILE* pipe = popen(cmd.c_str(), "r");
if (!pipe)
{
error("Failed to execute command: {COMMAND}", "COMMAND", cmd);
return {-1, std::string{}};
}
while (fgets(buffer.data(), buffer.size(), pipe) != nullptr)
{
result << buffer.data();
}
rc = pclose(pipe);
return {rc, result.str()};
}
} // namespace internal
} // namespace utils