| // Copyright (c) 2012 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 LOGIN_MANAGER_CHILD_JOB_H_ |
| #define LOGIN_MANAGER_CHILD_JOB_H_ |
| |
| #include <unistd.h> |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include <base/macros.h> |
| #include <base/time/time.h> |
| |
| namespace login_manager { |
| |
| class SystemUtils; |
| |
| // An interface declaring the basic functionality of a job that can be managed |
| // by SessionManagerService. |
| class ChildJobInterface { |
| public: |
| // A class that provides functionality for creating/destroying a subprocess. |
| // Intended to be embedded in an implementation of ChildJobInterface. |
| class Subprocess { |
| public: |
| Subprocess(uid_t desired_uid, SystemUtils* system); |
| virtual ~Subprocess(); |
| |
| // fork(), export |environment_variables|, and exec(argv). |
| // Returns false if fork() fails, true otherwise. |
| bool ForkAndExec( |
| const std::vector<std::string>& args, |
| const std::map<std::string, std::string>& environment_variables); |
| |
| // Sends signal to pid_. No-op if there is no subprocess running. |
| void Kill(int signal); |
| |
| // Sends signal to pid_'s entire process group. |
| // No-op if there is no subprocess running. |
| void KillEverything(int signal); |
| |
| pid_t pid() const { return pid_; } |
| void clear_pid() { pid_ = -1; } |
| |
| private: |
| // If the caller has provided a UID with set_desired_uid(), this method will |
| // 1) try to setgid to that uid |
| // 2) try to setgroups to that uid |
| // 3) try to setuid to that uid |
| // |
| // Returns 0 on success, the appropriate exit code (defined above) if a |
| // call fails. |
| int SetIDs(); |
| |
| // The pid of the managed subprocess, when running. Set to -1 when |
| // cleared, or not yet set by ForkAndExec(). |
| pid_t pid_; |
| // The uid the subprocess should be run as. |
| const uid_t desired_uid_; |
| SystemUtils* const system_; // weak; owned by embedder. |
| DISALLOW_COPY_AND_ASSIGN(Subprocess); |
| }; |
| |
| virtual ~ChildJobInterface() {} |
| |
| // Creates a background process and starts the job running in it. Does any |
| // necessary bookkeeping. |
| // Returns true if the process was created, false otherwise. |
| virtual bool RunInBackground() = 0; |
| |
| // Attempt to kill the current instance of this job by sending |
| // signal to the _entire process group_, sending message (if set) to |
| // the instance to tell it why it must die. |
| virtual void KillEverything(int signal, const std::string& message) = 0; |
| |
| // Attempt to kill the current instance of this job by sending |
| // signal, sending message (if set) to the instance to tell it |
| // why it must die. |
| virtual void Kill(int signal, const std::string& message) = 0; |
| |
| // Waits |timeout| for current instance of this job to go away, then |
| // aborts the entire process group if it's not gone. |
| virtual void WaitAndAbort(base::TimeDelta timeout) = 0; |
| |
| // Returns the name of the job. |
| virtual const std::string GetName() const = 0; |
| |
| // Returns the pid of the current instance of this job. May be -1. |
| virtual pid_t CurrentPid() const = 0; |
| |
| // Potential exit codes for use in Subprocess::Run(). |
| static const int kCantSetUid; |
| static const int kCantSetGid; |
| static const int kCantSetGroups; |
| static const int kCantSetEnv; |
| static const int kCantExec; |
| }; |
| |
| } // namespace login_manager |
| |
| #endif // LOGIN_MANAGER_CHILD_JOB_H_ |