| #include "config.h" | 
 |  | 
 | #include <sdbusplus/server.hpp> | 
 |  | 
 | #include <fstream> | 
 | #include <map> | 
 | #include <string> | 
 |  | 
 | namespace utils | 
 | { | 
 |  | 
 | /** | 
 |  * @brief Get the bus service | 
 |  * | 
 |  * @return the bus service as a string | 
 |  **/ | 
 | std::string getService(sdbusplus::bus::bus& bus, const std::string& path, | 
 |                        const std::string& interface); | 
 |  | 
 | /** | 
 |  * @brief Merge more files | 
 |  * | 
 |  * @param[in] srcFiles - source files | 
 |  * @param[out] dstFile - destination file | 
 |  * @return | 
 |  **/ | 
 | void mergeFiles(std::vector<std::string>& srcFiles, std::string& dstFile); | 
 |  | 
 | namespace internal | 
 | { | 
 |  | 
 | /** | 
 |  * @brief Construct an argument vector to be used with an exec command, which | 
 |  *        requires the name of the executable to be the first argument, and a | 
 |  *        null terminator to be the last. | 
 |  * @param[in] name - Name of the executable | 
 |  * @param[in] args - Optional arguments | 
 |  * @return char* vector | 
 |  */ | 
 | template <typename... Arg> | 
 | constexpr auto constructArgv(const char* name, Arg&&... args) | 
 | { | 
 |     std::vector<char*> argV{ | 
 |         {const_cast<char*>(name), const_cast<char*>(args)..., nullptr}}; | 
 |     return argV; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief Helper function to execute command in child process | 
 |  * @param[in] path - Fully qualified name of the executable to run | 
 |  * @param[in] args - Optional arguments | 
 |  * @return 0 on success | 
 |  */ | 
 | int executeCmd(const char* path, char** args); | 
 |  | 
 | } // namespace internal | 
 |  | 
 | /** | 
 |  * @brief Execute command in child process | 
 |  * @param[in] path - Fully qualified name of the executable to run | 
 |  * @param[in] args - Optional arguments | 
 |  * @return 0 on success | 
 |  */ | 
 | template <typename... Arg> | 
 | int execute(const char* path, Arg&&... args) | 
 | { | 
 |     auto argArray = internal::constructArgv(path, std::forward<Arg>(args)...); | 
 |  | 
 |     return internal::executeCmd(path, argArray.data()); | 
 | } | 
 |  | 
 | } // namespace utils |