summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-04-09 16:43:06 +0300
committerSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-04-09 16:43:06 +0300
commit6a2ef269f37820db40b0d1cd19d7fdb7696c0d2a (patch)
tree9d33c76dd4ae570837dfc10793cb0849c8abc2f5
parente8481260d763f8827e0188e5cd53e613aa4bd305 (diff)
downloadlibmts-6a2ef269f37820db40b0d1cd19d7fdb7696c0d2a.tar.gz
libmts-6a2ef269f37820db40b0d1cd19d7fdb7696c0d2a.tar.bz2
libmts-6a2ef269f37820db40b0d1cd19d7fdb7696c0d2a.zip
Execute system commands without invoking system shell
Changes after a code review: - fixed documentation for the closeBackground function - renamed ```app``` parameter to ```cmd```
-rw-r--r--include/mts/MTS_System.h16
-rw-r--r--src/MTS_System.cpp18
2 files changed, 16 insertions, 18 deletions
diff --git a/include/mts/MTS_System.h b/include/mts/MTS_System.h
index 6bca21b..cd9b9dd 100644
--- a/include/mts/MTS_System.h
+++ b/include/mts/MTS_System.h
@@ -71,12 +71,12 @@ namespace MTS {
* A safer alternative to System::cmd that allows to execute applications with controlled
* list of arguments bypasing the system shell.
*
- * \param app name of the application to be executed
+ * \param cmd name of the application to be executed
* \param argv vector of arguments (excluding argument zero)
* \param result stdout output from the application is stored here
* \return result code as for std::system and UNIX pclose
*/
- static int32_t execute(const std::string& app, const std::vector<std::string>& argv, std::string& result);
+ static int32_t execute(const std::string& cmd, const std::vector<std::string>& argv, std::string& result);
//! Spawn a process and open pipe with the specified type (READ or WRITE)
/*!
@@ -84,18 +84,16 @@ namespace MTS {
* list of arguments bypasing the system shell. If succeded, information about the spawned
* process is written to the \p child structure.
*
- * \param app name of the application to be executed
+ * \param cmd name of the application to be executed
* \param argv vector of arguments (excluding argument zero)
* \param type open pipe for read from child or write to child
* \return true on success, false on failure
*/
- static bool executeBackground(const std::string& app, const std::vector<std::string>& argv, PipeType type, ChildHandle& child);
+ static bool executeBackground(const std::string& cmd, const std::vector<std::string>& argv, PipeType type, ChildHandle& child);
//! Close the pipe and wait for a child to finish execution
/*!
- * \param child name of the application to be executed
- * \param argv vector of arguments (excluding argument zero)
- * \param result stdout output from the application is stored here
+ * \param child structure with child process information as populated by executeBackground
* \return result code as for std::system and UNIX pclose
*/
static int closeBackground(ChildHandle& child);
@@ -103,13 +101,13 @@ namespace MTS {
private:
//! Spawn a process and open pipe with the specified type (READ or WRITE)
- static bool executeBackground(const std::string& app, char* const argv[], PipeType type, ChildHandle& child);
+ static bool executeBackground(const std::string& cmd, char* const argv[], PipeType type, ChildHandle& child);
//! Utility method. Cast argument to a C pointer required by some C-style functions.
static inline char* castArgument(const std::string& arg);
//! Utility method. Convert argument vector to a format required by execve and posix_spawn.
- static std::vector<char*> castArgVector(const std::string& app, const std::vector<std::string>& argv);
+ static std::vector<char*> castArgVector(const std::string& cmd, const std::vector<std::string>& argv);
//! Lightweight C++ wrapper with auto-close for file descriptors
class FdWrapper {
diff --git a/src/MTS_System.cpp b/src/MTS_System.cpp
index 6acf065..31976e1 100644
--- a/src/MTS_System.cpp
+++ b/src/MTS_System.cpp
@@ -172,7 +172,7 @@ int32_t System::readFile(const std::string& path, std::string& result) {
return 0;
}
-int32_t System::execute(const std::string& app, const std::vector<std::string>& argv, std::string& result) {
+int32_t System::execute(const std::string& cmd, const std::vector<std::string>& argv, std::string& result) {
// Ported directly from System::cmd
std::string output;
const int max_buffer = 256;
@@ -180,7 +180,7 @@ int32_t System::execute(const std::string& app, const std::vector<std::string>&
int32_t code = -1;
ChildHandle child;
- if (executeBackground(app, argv, PipeType::READ, child)) {
+ if (executeBackground(cmd, argv, PipeType::READ, child)) {
while (!feof(child.stream)) {
if (fgets(buffer, max_buffer, child.stream) != NULL) {
output.append(buffer);
@@ -194,9 +194,9 @@ int32_t System::execute(const std::string& app, const std::vector<std::string>&
return code;
}
-bool System::executeBackground(const std::string& app, const std::vector<std::string>& argv, System::PipeType type, System::ChildHandle& child) {
- std::vector<char*> arguments = castArgVector(app, argv);
- return executeBackground(app, arguments.data(), type, child);
+bool System::executeBackground(const std::string& cmd, const std::vector<std::string>& argv, System::PipeType type, System::ChildHandle& child) {
+ std::vector<char*> arguments = castArgVector(cmd, argv);
+ return executeBackground(cmd, arguments.data(), type, child);
}
int System::closeBackground(System::ChildHandle& child) {
@@ -212,7 +212,7 @@ int System::closeBackground(System::ChildHandle& child) {
return pstat;
}
-bool System::executeBackground(const std::string& app, char* const argv[], System::PipeType type, ChildHandle& child) {
+bool System::executeBackground(const std::string& cmd, char* const argv[], System::PipeType type, ChildHandle& child) {
pid_t childPid;
FILE* stream = NULL;
posix_spawn_file_actions_t actions;
@@ -262,7 +262,7 @@ bool System::executeBackground(const std::string& app, char* const argv[], Syste
break;
}
- if (posix_spawnp(&childPid, app.c_str(), &actions, NULL, argv, NULL) != 0) {
+ if (posix_spawnp(&childPid, cmd.c_str(), &actions, NULL, argv, NULL) != 0) {
// failed to spawn the process
break;
}
@@ -294,11 +294,11 @@ char* System::castArgument(const std::string& arg) {
return const_cast<char*>(arg.c_str());
}
-std::vector<char*> System::castArgVector(const std::string& app, const std::vector<std::string>& argv) {
+std::vector<char*> System::castArgVector(const std::string& cmd, const std::vector<std::string>& argv) {
std::vector<char*> result;
// Append application name as argument zero
- result.push_back(castArgument(app));
+ result.push_back(castArgument(cmd));
// Append all other arguments
for (const std::string& arg : argv) {