blob: 3dad91a9b041a36af3cf9ba9b0e9c9b641b9e871 [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;
}