| #include "common/include/utils.hpp" | 
 |  | 
 | #include <phosphor-logging/lg2.hpp> | 
 |  | 
 | PHOSPHOR_LOG2_USING; | 
 |  | 
 | sdbusplus::async::task<bool> asyncSystem(sdbusplus::async::context& ctx, | 
 |                                          const std::string& cmd) | 
 | { | 
 |     int pipefd[2]; | 
 |     if (pipe(pipefd) == -1) | 
 |     { | 
 |         error("Failed to create pipe for command: {CMD}", "CMD", cmd); | 
 |         co_return false; | 
 |     } | 
 |  | 
 |     pid_t pid = fork(); | 
 |     if (pid == 0) | 
 |     { | 
 |         close(pipefd[0]); | 
 |  | 
 |         int exitCode = std::system(cmd.c_str()); | 
 |         ssize_t status = write(pipefd[1], &exitCode, sizeof(exitCode)); | 
 |  | 
 |         close(pipefd[1]); | 
 |         _exit((status == sizeof(exitCode)) ? 0 : 1); | 
 |     } | 
 |     else if (pid > 0) | 
 |     { | 
 |         close(pipefd[1]); | 
 |  | 
 |         auto fdio = std::make_unique<sdbusplus::async::fdio>(ctx, pipefd[0]); | 
 |  | 
 |         if (!fdio) | 
 |         { | 
 |             error("Failed to create fdio for command: {CMD}", "CMD", cmd); | 
 |             close(pipefd[0]); | 
 |             co_return false; | 
 |         } | 
 |  | 
 |         co_await fdio->next(); | 
 |  | 
 |         int exitCode = -1; | 
 |         ssize_t bytesRead = read(pipefd[0], &exitCode, sizeof(exitCode)); | 
 |         close(pipefd[0]); | 
 |  | 
 |         if (bytesRead != sizeof(exitCode)) | 
 |         { | 
 |             error("Failed to read exit code from command {CMD}", "CMD", cmd); | 
 |             co_return false; | 
 |         } | 
 |  | 
 |         int status; | 
 |         if (waitpid(pid, &status, 0) < 0) | 
 |         { | 
 |             error("waitpid failed for PID {PID} for command {CMD}", "PID", pid, | 
 |                   "CMD", cmd); | 
 |             co_return false; | 
 |         } | 
 |  | 
 |         if (exitCode != 0) | 
 |         { | 
 |             error("Command {CMD} exited with code {CODE}", "CMD", cmd, "CODE", | 
 |                   exitCode); | 
 |             co_return false; | 
 |         } | 
 |  | 
 |         debug("{CMD} executed successfully", "CMD", cmd); | 
 |  | 
 |         co_return true; | 
 |     } | 
 |     else | 
 |     { | 
 |         error("Fork failed for command: {CMD}", "CMD", cmd); | 
 |         close(pipefd[0]); | 
 |         close(pipefd[1]); | 
 |         co_return false; | 
 |     } | 
 | } |