blob: 5b81488e0a6e0780d534ab21781f8dc9636675ca [file] [log] [blame]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_HOST_LINUX_LINUX_PROCESS_LAUNCHER_DELEGATE_H_
#define REMOTING_HOST_LINUX_LINUX_PROCESS_LAUNCHER_DELEGATE_H_
#include <memory>
#include "base/command_line.h"
#include "base/environment.h"
#include "base/files/file_path.h"
#include "base/location.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/process/process.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "base/thread_annotations.h"
#include "base/threading/sequence_bound.h"
#include "ipc/ipc_channel_proxy.h"
#include "ipc/ipc_listener.h"
#include "remoting/host/mojom/desktop_session.mojom.h"
#include "remoting/host/worker_process_launcher.h"
namespace remoting {
// Implements logic for launching and monitoring a worker process, which may be
// run as a different user.
class LinuxWorkerProcessLauncherDelegate
: public WorkerProcessLauncher::Delegate,
public IPC::Listener {
public:
struct LaunchOptions {
explicit LaunchOptions(base::CommandLine command_line);
LaunchOptions(LaunchOptions&&);
LaunchOptions(const LaunchOptions&);
~LaunchOptions();
// The command line to launch.
base::CommandLine command_line;
// If true, creates a session and sets the process group ID for the process
// to be launched, i.e. calling setsid().
bool new_session = false;
// The effective user ID of the process to be launched. A negative value
// indicates no change of the effective user.
int uid = -1;
// The effective group ID of the process to be launched. A negative value
// indicates no change of the effective group ID.
int gid = -1;
// The working directory of the process to be launched. An empty value
// indicates no change of the working directory.
base::FilePath working_dir;
// The environment variables to be set on the process to be launched. Note
// that none of the parent process' environment variables will be inherited.
base::EnvironmentMap environment_variables;
};
LinuxWorkerProcessLauncherDelegate(
LaunchOptions options,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
~LinuxWorkerProcessLauncherDelegate() override;
LinuxWorkerProcessLauncherDelegate(
const LinuxWorkerProcessLauncherDelegate&) = delete;
LinuxWorkerProcessLauncherDelegate& operator=(
const LinuxWorkerProcessLauncherDelegate&) = delete;
// WorkerProcessLauncher::Delegate implementation.
void LaunchProcess(WorkerProcessLauncher* event_handler) override;
void GetRemoteAssociatedInterface(
mojo::GenericPendingAssociatedReceiver receiver) override;
void CloseChannel() override;
void CrashProcess(const base::Location& location) override;
void KillProcess() override;
private:
class ProcessExitWatcher;
// IPC::Listener implementation.
void OnChannelConnected(int32_t peer_pid) override;
void OnChannelError() override;
void OnAssociatedInterfaceRequest(
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle handle) override;
void WatchForProcessExit();
void OnProcessExited(int exit_code);
void ReportFatalError();
SEQUENCE_CHECKER(sequence_checker_);
const LaunchOptions options_ GUARDED_BY_CONTEXT(sequence_checker_);
// The server end of the IPC channel used to communicate to the worker
// process.
std::unique_ptr<IPC::ChannelProxy> channel_
GUARDED_BY_CONTEXT(sequence_checker_);
// The worker process, if launched.
base::Process worker_process_;
base::SequenceBound<ProcessExitWatcher> process_exit_watcher_
GUARDED_BY_CONTEXT(sequence_checker_);
mojo::AssociatedRemote<mojom::WorkerProcessControl> worker_process_control_;
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_
GUARDED_BY_CONTEXT(sequence_checker_);
raw_ptr<WorkerProcessLauncher> event_handler_
GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
base::WeakPtrFactory<LinuxWorkerProcessLauncherDelegate> weak_ptr_factory_{
this};
};
} // namespace remoting
#endif // REMOTING_HOST_LINUX_LINUX_PROCESS_LAUNCHER_DELEGATE_H_