| 293 | |
| 294 | |
| 295 | std::unique_ptr<ShellCommand> ShellCommand::executeDirect(const ShellCommand::Config & config) |
| 296 | { |
| 297 | const auto & path = config.command; |
| 298 | const auto & arguments = config.arguments; |
| 299 | |
| 300 | size_t argv_sum_size = path.size() + 1; |
| 301 | for (const auto & arg : arguments) |
| 302 | argv_sum_size += arg.size() + 1; |
| 303 | |
| 304 | std::vector<char *> argv(arguments.size() + 2); |
| 305 | std::vector<char> argv_data(argv_sum_size); |
| 306 | WriteBufferFromPointer writer(argv_data.data(), argv_sum_size); |
| 307 | |
| 308 | argv[0] = writer.position(); |
| 309 | writer.write(path.data(), path.size() + 1); |
| 310 | |
| 311 | for (size_t i = 0, size = arguments.size(); i < size; ++i) |
| 312 | { |
| 313 | argv[i + 1] = writer.position(); |
| 314 | writer.write(arguments[i].data(), arguments[i].size() + 1); |
| 315 | } |
| 316 | |
| 317 | writer.finalize(); |
| 318 | |
| 319 | argv[arguments.size() + 1] = nullptr; |
| 320 | |
| 321 | return executeImpl(path.data(), argv.data(), config); |
| 322 | } |
| 323 | |
| 324 | struct ShellCommand::tryWaitResult |
| 325 | { |