// 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 FOOMATIC_SHELL_PROCESS_LAUNCHER_H_
#define FOOMATIC_SHELL_PROCESS_LAUNCHER_H_

#include <sys/types.h>

#include <memory>
#include <set>
#include <string>

#include "foomatic_shell/grammar.h"

namespace brillo {
class Process;
}

namespace foomatic_shell {

// Exit code reported when an error occurs of the shell side.
constexpr int kShellError = 127;

// This class is responsible for executing given Script object. It launches
// all commands and subshells from the Script in a correct order and join them
// with pipes. All errors are reported to standard error stream.
class ProcessLauncher {
 public:
  // Constructor. |source| is a reference to original sources of executed
  // script and it must be constant and valid during the lifetime of the
  // object. |source| is used only for building error messages.
  // |verbose_mode| activates additional logs on stderr.
  explicit ProcessLauncher(const std::string& source, bool verbose_mode)
      : source_(source), verbose_(verbose_mode) {}

  // This method executes the given |script|. A file descriptor |input_fd| is
  // connected as a standard input stream for executed script, while a file
  // descriptor |output_fd| is connected as a standard output stream. The
  // execution is stopped on the first failing pipeline. The method returns
  // exit code of the last executed pipeline. Only zero guarantees that the
  // whole script was executed.
  int RunScript(const Script& script, int input_fd, int output_fd);

 private:
  // Helper methods.
  int RunPipeline(const Pipeline& pipeline, int input_fd, int output_fd);
  std::unique_ptr<brillo::Process> StartProcess(const Command& command,
                                                int input_fd,
                                                int output_fd);
  pid_t StartSubshell(const Script& script,
                      int input_fd,
                      int output_fd,
                      std::set<int> open_fds);

  // This field holds the reference to the script's source provided in the
  // constructor.
  const std::string& source_;
  // This field enables additional logging.
  bool verbose_;
};

}  // namespace foomatic_shell

#endif  // FOOMATIC_SHELL_PROCESS_LAUNCHER_H_
