| // Copyright 2012 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef LOGIN_MANAGER_SUBPROCESS_H_ | |
| #define LOGIN_MANAGER_SUBPROCESS_H_ | |
| #include <unistd.h> | |
| #include <optional> | |
| #include <string> | |
| #include <vector> | |
| #include <base/files/file_path.h> | |
| #include <base/time/time.h> | |
| namespace login_manager { | |
| class SystemUtils; | |
| class SubprocessInterface { | |
| public: | |
| virtual ~SubprocessInterface() {} | |
| virtual void UseNewMountNamespace() = 0; | |
| virtual void EnterExistingMountNamespace( | |
| const base::FilePath& ns_mnt_path) = 0; | |
| // fork(), export |environment_variables|, and exec(argv, env_vars). | |
| // Returns false if fork() fails, true otherwise. | |
| virtual bool ForkAndExec(const std::vector<std::string>& args, | |
| const std::vector<std::string>& env_vars) = 0; | |
| // Sends signal to pid_. No-op if there is no subprocess running. | |
| virtual void Kill(int signal) = 0; | |
| // Sends signal to pid_'s entire process group. | |
| // No-op if there is no subprocess running. | |
| virtual void KillEverything(int signal) = 0; | |
| virtual pid_t GetPid() const = 0; | |
| virtual void ClearPid() = 0; | |
| }; | |
| // A class that provides functionality for creating/destroying a subprocess. | |
| // Intended to be embedded in an implementation of ChildJobInterface. | |
| class Subprocess : public SubprocessInterface { | |
| public: | |
| Subprocess(uid_t uid, SystemUtils* system); | |
| Subprocess(const Subprocess&) = delete; | |
| Subprocess& operator=(const Subprocess&) = delete; | |
| ~Subprocess() override; | |
| // SubprocessInterface: | |
| void UseNewMountNamespace() override; | |
| void EnterExistingMountNamespace(const base::FilePath& ns_mnt_path) override; | |
| bool ForkAndExec(const std::vector<std::string>& args, | |
| const std::vector<std::string>& env_vars) override; | |
| void Kill(int signal) override; | |
| void KillEverything(int signal) override; | |
| pid_t GetPid() const override; | |
| void ClearPid() override; | |
| private: | |
| // The pid of the managed subprocess, when running. | |
| std::optional<pid_t> pid_; | |
| // Run-time options for the subprocess. | |
| // The UID the subprocess should be run as. | |
| const uid_t desired_uid_; | |
| // Whether to enter a new mount namespace before execve(2)-ing the subprocess. | |
| bool new_mount_namespace_ = false; | |
| // If present, enter an existing mount namespace before execve(2)-ing the | |
| // subprocess. | |
| // Mutually exclusive with |new_mount_namespace_|. | |
| std::optional<base::FilePath> ns_mnt_path_; | |
| SystemUtils* const system_; // weak; owned by embedder. | |
| }; | |
| } // namespace login_manager | |
| #endif // LOGIN_MANAGER_SUBPROCESS_H_ |