19 : m_raw_command(raw_command)
25 m_argv =
new char*[m_cmd_tokens.size() + 1];
28 copyCommandTokensToArgv();
33 Command(static_cast<std::string>(raw_command))
39 m_raw_command(command.m_raw_command), m_cmd_tokens(command.m_cmd_tokens)
42 m_argv =
new char*[m_cmd_tokens.size() + 1];
45 copyCommandTokensToArgv();
50 m_raw_command(std::move(command.m_raw_command)),
51 m_cmd_tokens(std::move(command.m_cmd_tokens))
54 m_argv = command.m_argv;
55 command.m_argv =
nullptr;
62 m_raw_command = command.m_raw_command;
65 if (m_argv !=
nullptr)
69 m_cmd_tokens = command.m_cmd_tokens;
72 m_argv =
new char*[m_cmd_tokens.size() + 1];
75 copyCommandTokensToArgv();
86 m_raw_command = std::move(command.m_raw_command);
89 if (m_argv !=
nullptr)
93 m_cmd_tokens = std::move(command.m_cmd_tokens);
96 m_argv = command.m_argv;
97 command.m_argv =
nullptr;
106 if (m_argv !=
nullptr)
113 return m_raw_command;
123 void Command::copyCommandTokensToArgv()
126 for (
int i = 0; i < m_cmd_tokens.size(); i++)
129 m_argv[i] =
new char[m_cmd_tokens[i].size() + 1];
132 strcpy(m_argv[i], m_cmd_tokens[i].c_str());
136 m_argv[m_cmd_tokens.size()] =
nullptr;
140 void Command::freeArgv()
143 for (
int i = 0; i < m_cmd_tokens.size(); i++)
156 std::string file = m_argv[0];
160 size_t found = file.find(
'/');
161 if (found != std::string::npos)
162 return (access(file.c_str(), F_OK | X_OK) == 0);
165 char *path = getenv(
"PATH");
166 std::string path_str;
171 size_t pathlen = confstr(_CS_PATH,
nullptr, 0);
172 path = (
char *) malloc(pathlen *
sizeof(
char));
173 confstr(_CS_PATH, path, pathlen);
174 path_str.assign(
":");
179 path_str.assign(path);
182 size_t left = 0, right = 0;
188 right = path_str.find(
':', left);
198 cmd += path_str.substr(left, right - left);
203 if (access(cmd.c_str(), F_OK | X_OK) == 0)
206 }
while (++right != 0);
bool isExecutable() const
const std::string & str() const
Command & operator=(const Command &command)
std::vector< std::string > parse_command_tokens(const std::string &raw_command)