|  | // Copyright 2018 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | library fuchsia.process; | 
|  |  | 
|  | using fuchsia.io; | 
|  | using zx; | 
|  |  | 
|  | struct HandleInfo { | 
|  | // The handle to use for this argument. | 
|  | handle handle; | 
|  |  | 
|  | // Process argument identifier, from <zircon/processargs.h>. | 
|  | uint32 id; | 
|  | }; | 
|  |  | 
|  | struct NameInfo { | 
|  | // Path at which to install the associated directory. | 
|  | // | 
|  | // Must be an absolute path (i.e., start with '/'). | 
|  | string path; | 
|  |  | 
|  | // The associated directory. | 
|  | fuchsia.io.Directory directory; | 
|  | }; | 
|  |  | 
|  | struct LaunchInfo { | 
|  | // The executable to run in the process. | 
|  | handle<vmo> executable; | 
|  |  | 
|  | // The job in which to create the process. | 
|  | handle<job> job; | 
|  |  | 
|  | // The name to assign to the created process. | 
|  | string name; | 
|  | }; | 
|  |  | 
|  | struct LaunchResult { | 
|  | // A status code describing the result of the launch. | 
|  | zx.status status; | 
|  |  | 
|  | // A string describing the failure. | 
|  | // | 
|  | // Non-null when |status| is an error. | 
|  | string? error_message; | 
|  |  | 
|  | // The process that was launched. | 
|  | // | 
|  | // Present when |status| is ZX_OK. | 
|  | handle<process>? process; | 
|  | }; | 
|  |  | 
|  | struct ProcessStartData { | 
|  | // The process that was created. | 
|  | handle<process> process; | 
|  |  | 
|  | // The vmar object that was created when the process was created. | 
|  | // | 
|  | // See <https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/process_create.md>. | 
|  | handle<vmar> root_vmar; | 
|  |  | 
|  | // The initial thread for the process. | 
|  | // | 
|  | // Should be passed to |zx_process_start| when starting the process. | 
|  | handle<thread> thread; | 
|  |  | 
|  | // The address of the initial entry point in the process. | 
|  | // | 
|  | // Should be passed to |zx_process_start| when starting the process. | 
|  | uint64 entry; | 
|  |  | 
|  | // The stack pointer value for the initial thread of the process. | 
|  | // | 
|  | // Should be passed to |zx_process_start| when starting the process. | 
|  | uint64 sp; | 
|  |  | 
|  | // The bootstrap channel to pass to the process on startup. | 
|  | // | 
|  | // Should be passed to |zx_process_start| when starting the process. | 
|  | handle<channel> bootstrap; | 
|  |  | 
|  | // The base address of the vDSO to pass to the process on startup. | 
|  | // | 
|  | // Should be passed to |zx_process_start| when starting the process. | 
|  | uint64 vdso_base; | 
|  |  | 
|  | // The base load address of the ELF file loaded. | 
|  | // | 
|  | // Most often used by debuggers or other tools that inspect the process. | 
|  | uint64 base; | 
|  | }; | 
|  |  | 
|  | struct CreateWithoutStartingResult { | 
|  | // A status code describing the result of the launch. | 
|  | zx.status status; | 
|  |  | 
|  | // A string describing the failure. | 
|  | // | 
|  | // Non-null when |status| is an error. | 
|  | string? error_message; | 
|  |  | 
|  | // Data describing the process that was created. | 
|  | // | 
|  | // Non-null when |status| is ZX_OK. | 
|  | ProcessStartData? data; | 
|  | }; | 
|  |  | 
|  | [Discoverable] | 
|  | interface Launcher { | 
|  | // Creates and starts the process described by |info|. | 
|  | // | 
|  | // After processing this message, the |Launcher| is reset to its initial | 
|  | // state and is ready to launch another process. | 
|  | 1: Launch(LaunchInfo info) -> (LaunchResult result); | 
|  |  | 
|  | // Creates the process described by |info| but does not start it. | 
|  | // | 
|  | // After processing this message, the |Launcher| is reset to its initial | 
|  | // state and is ready to launch another process. | 
|  | // | 
|  | // The caller is responsible for calling |zx_process_start| using the data | 
|  | // in |ProcessStartData| to actually start the process. | 
|  | 2: CreateWithoutStarting(LaunchInfo info) -> (CreateWithoutStartingResult result); | 
|  |  | 
|  | // Adds the given arguments to the command-line for the process. | 
|  | // | 
|  | // Calling this method multiple times concatenattes the arguments. | 
|  | 10: AddArgs(vector<string> args); | 
|  |  | 
|  | // Adds the given variables to the environment variables for the process. | 
|  | // | 
|  | // Calling this method multiple times concatenates the variables. | 
|  | 11: AddEnvirons(vector<string> environ); | 
|  |  | 
|  | // Adds the given names to the namespace for the process. | 
|  | // | 
|  | // The paths in the namespace must be non-overlapping. See | 
|  | // <https://fuchsia.googlesource.com/docs/+/master/the-book/namespaces.md> for details. | 
|  | // | 
|  | // Calling this method multiple times concatenates the names. | 
|  | 12: AddNames(vector<NameInfo> names); | 
|  |  | 
|  | // Adds the given handles to the startup handles for the process. | 
|  | // | 
|  | // Calling this method multiple times concatenates the handles. | 
|  | 13: AddHandles(vector<HandleInfo> handles); | 
|  | }; |