| // Copyright 2017 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 VM_TOOLS_MAITRED_INIT_H_ |
| #define VM_TOOLS_MAITRED_INIT_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <base/threading/thread.h> |
| |
| namespace vm_tools { |
| namespace maitred { |
| |
| // Encapsulates all the functionality for which maitred is responsible when it |
| // runs as pid 1 on a VM. |
| class Init final { |
| public: |
| // The reason why a process exited. |
| enum class ProcessStatus { |
| // Process is in an unknown state. |
| UNKNOWN, |
| |
| // Process exited. |
| EXITED, |
| |
| // Killed by a signal. |
| SIGNALED, |
| |
| // Launched but may or may not have exited yet. |
| LAUNCHED, |
| |
| // One or more setup steps failed and the process did not launch. |
| FAILED, |
| }; |
| |
| // Information about a process launch. |
| struct ProcessLaunchInfo { |
| ProcessLaunchInfo() = default; |
| |
| // Current status of the process. |
| ProcessStatus status = ProcessStatus::UNKNOWN; |
| |
| // If |status| is EXITED, then this will hold the exit status. If |status| |
| // is SIGNALED, then this will hold the signal number that killed the |
| // process. Otherwise this value is undefined. |
| int32_t code = 0; |
| |
| // Output from the process's stdout handle. |
| // Only filled when spawned with |wait_for_exit| = true and |use_console| = |
| // false. |
| std::string output; |
| |
| // If the spawned process potentially produced more than the maximum allowed |
| // output, |output_truncated| will be set to true. |
| bool output_truncated; |
| }; |
| |
| // Creates a new instance of this class and performs various bits of early |
| // setup up like mounting file systems, creating directories, and setting |
| // up signal handlers. |
| static std::unique_ptr<Init> Create(); |
| ~Init(); |
| |
| // Spawn a process with the given argv and environment. |argv[0]| must be |
| // the full path to the program or the name of a program found in PATH. If |
| // |wait_for_exit| is true, then wait for the spawned process to exit and |
| // fill in |launch_info| with the information about the process's exit. |
| bool Spawn(std::vector<std::string> argv, |
| std::map<std::string, std::string> env, |
| bool respawn, |
| bool use_console, |
| bool wait_for_exit, |
| ProcessLaunchInfo* launch_info, |
| base::Optional<base::Callback<void(ProcessStatus, int)>> exit_cb = |
| base::nullopt); |
| |
| // Shuts down the system, killing all child processes first with SIGTERM and |
| // finally with SIGKILL. |
| void Shutdown(); |
| |
| private: |
| Init() = default; |
| Init(const Init&) = delete; |
| Init& operator=(const Init&) = delete; |
| |
| // Subroutine to setup resource limits. For more details of resource limits, |
| // see man page of setrlimits and sysctl. |
| bool SetupResourceLimit(); |
| |
| bool Setup(); |
| |
| // Worker that lives on a separate thread and is responsible for actually |
| // doing all the work. |
| class Worker; |
| std::unique_ptr<Worker> worker_; |
| |
| // The actual worker thread. |
| base::Thread worker_thread_{"init worker thread"}; |
| }; |
| |
| } // namespace maitred |
| } // namespace vm_tools |
| |
| #endif // VM_TOOLS_MAITRED_INIT_H_ |