// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MINIOS_PROCESS_MANAGER_H_
#define MINIOS_PROCESS_MANAGER_H_

#include <memory>
#include <string>
#include <vector>

#include <brillo/process/process.h>

#include "minios/process_manager_interface.h"

class ProcessManager : public ProcessManagerInterface {
 public:
  ProcessManager() = default;
  ~ProcessManager() = default;

  // ProcessManagerInterface overrides these functions.

  // Runs the command line with input and output redirected and returns the exit
  // code. Input and output files will be ignored if strings are empty.
  int RunCommand(
      const std::vector<std::string>& cmd,
      const ProcessManagerInterface::IORedirection& io_redirection) override;

  // Starts the command line with the input and output redirected in the
  // background, returns true on success and sets pid. Input and output files
  // will be ignored if the strings are empty.
  bool RunBackgroundCommand(
      const std::vector<std::string>& cmd,
      const ProcessManagerInterface::IORedirection& io_redirection,
      pid_t* pid) override;

  // Runs the command and reads the output and error to the strings. Returns
  // false or sets the return code and stderr message on failure.
  bool RunCommandWithOutput(const std::vector<std::string>& cmd,
                            int* return_code,
                            std::string* stdout_out,
                            std::string* stderr_out) override;

 private:
  ProcessManager(const ProcessManager&) = delete;
  ProcessManager& operator=(const ProcessManager&) = delete;

  std::unique_ptr<brillo::Process> CreateProcess(
      const std::vector<std::string>& cmd,
      const ProcessManagerInterface::IORedirection& io_redirection);
};

#endif  // MINIOS_PROCESS_MANAGER_H_
