blob: 3d26e5df5c3eff0f05b6b0bcb287c55496bfa567 [file] [log] [blame] [edit]
// Copyright 2020 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "minios/process_manager.h"
#include <unistd.h>
#include <string>
#include <vector>
#include <base/logging.h>
#include <base/posix/eintr_wrapper.h>
using std::string;
using std::vector;
std::unique_ptr<brillo::Process> ProcessManager::CreateProcess(
const vector<string>& cmd,
const ProcessManagerInterface::IORedirection& io_redirection) {
std::unique_ptr<brillo::Process> process(new brillo::ProcessImpl);
for (const auto& arg : cmd) {
process->AddArg(arg);
}
if (!io_redirection.input.empty()) {
process->RedirectInput(io_redirection.input);
}
if (!io_redirection.output.empty()) {
process->RedirectOutput(io_redirection.output);
}
return process;
}
int ProcessManager::RunCommand(
const vector<string>& cmd,
const ProcessManagerInterface::IORedirection& io_redirection) {
auto process = CreateProcess(cmd, io_redirection);
return process->Run();
}
bool ProcessManager::RunBackgroundCommand(
const vector<string>& cmd,
const ProcessManagerInterface::IORedirection& io_redirection,
pid_t* pid) {
auto process = CreateProcess(cmd, io_redirection);
if (!process->Start()) {
return false;
}
*pid = process->pid();
// Need to release the process so it's not destructed at return.
process->Release();
return true;
}
bool ProcessManager::RunCommandWithOutput(const vector<string>& cmd,
int* return_code,
string* stdout_out,
string* stderr_out) {
brillo::ProcessImpl process;
for (const auto& arg : cmd) {
process.AddArg(arg);
}
if (stdout_out) {
process.RedirectUsingMemory(STDOUT_FILENO);
}
if (stderr_out) {
process.RedirectUsingMemory(STDERR_FILENO);
}
const auto exit_code = process.Run();
if (stdout_out) {
*stdout_out = process.GetOutputString(STDOUT_FILENO);
}
if (stderr_out) {
*stderr_out = process.GetOutputString(STDERR_FILENO);
}
if (return_code) {
*return_code = exit_code;
}
return exit_code != brillo::Process::kErrorExitStatus;
}