From 99268496408c080d8473db1b05d8c390d2ce2f0b Mon Sep 17 00:00:00 2001 From: Riyyi Date: Fri, 17 Sep 2021 12:52:36 +0200 Subject: [PATCH] Util: Add class Shell for executing more basic OS shell commands --- src/util/shell.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++ src/util/shell.h | 30 +++++++++++++++++++++++++ src/util/system.cpp | 8 +++---- 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/util/shell.cpp create mode 100644 src/util/shell.h diff --git a/src/util/shell.cpp b/src/util/shell.cpp new file mode 100644 index 0000000..12f06d4 --- /dev/null +++ b/src/util/shell.cpp @@ -0,0 +1,53 @@ +#include // pclose, perror, popen +#include +#include + +#include "util/shell.h" + +namespace Util { + +Shell::Shell() +{ +} + +Shell::Shell(std::string output, int status) + : m_output(output) + , m_status(status) +{ +} + +Shell Shell::operator()(const char* command) +{ + FILE* shell = popen(command, "r"); + if (!shell) { + perror("\033[31;1mError:\033[0m popen"); + return { "", -1 }; + } + + std::string output; + + constexpr int bufferSize = 4096; + char buffer[bufferSize]; + while (fgets(buffer, sizeof(buffer), shell)) { + output.append(buffer); + } + + int status = pclose(shell); + if (status < 0) { + perror("\033[31;1mError:\033[0m pclose"); + } + + return { output, status }; +} + +Shell Shell::operator()(std::string command) +{ + return operator()(command.c_str()); +} + +Shell Shell::operator()(std::string_view command) +{ + return operator()(command.data()); +} + +} // namespace Util diff --git a/src/util/shell.h b/src/util/shell.h new file mode 100644 index 0000000..8b20003 --- /dev/null +++ b/src/util/shell.h @@ -0,0 +1,30 @@ +#ifndef SHELL_H +#define SHELL_H + +#include +#include + +namespace Util { + +class Shell { +public: + Shell(); + virtual ~Shell() {} + + Shell operator()(const char* command); + Shell operator()(std::string command); + Shell operator()(std::string_view command); + + std::string output() const { return m_output; } + int status() const { return m_status; } + +private: + Shell(std::string output, int status); + + std::string m_output; + int m_status { 0 }; +}; + +} // namespace Util + +#endif // SHELL_H diff --git a/src/util/system.cpp b/src/util/system.cpp index 5123d65..403ccec 100644 --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -160,20 +160,20 @@ System System::exec(std::string input) int stdoutFd[2]; int stderrFd[2]; if (pipe(stdinFd) < 0) { - perror("\033[31;1mError\033[0m"); + perror("\033[31;1mError:\033[0m pipe"); } if (pipe(stdoutFd) < 0) { - perror("\033[31;1mError\033[0m"); + perror("\033[31;1mError:\033[0m pipe"); } if (pipe(stderrFd) < 0) { - perror("\033[31;1mError\033[0m"); + perror("\033[31;1mError:\033[0m pipe"); } pid_t pid = fork(); switch (pid) { // Failed case -1: - perror("\033[31;1mError\033[0m"); + perror("\033[31;1mError:\033[0m fork"); break; // Child case 0: {