3 changed files with 87 additions and 4 deletions
			
			
		@ -0,0 +1,53 @@
					 | 
				
			||||
#include <cstdio> // pclose, perror, popen | 
				
			||||
#include <string> | 
				
			||||
#include <string_view> | 
				
			||||
 | 
				
			||||
#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
 | 
				
			||||
@ -0,0 +1,30 @@
					 | 
				
			||||
#ifndef SHELL_H | 
				
			||||
#define SHELL_H | 
				
			||||
 | 
				
			||||
#include <string> | 
				
			||||
#include <string_view> | 
				
			||||
 | 
				
			||||
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
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue