// 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.ldsvc;
using zx;

/// The maximum size for a name used by `Resolver`.
const uint32 MAX_RESOLVE_NAME_SIZE = 2048;

/// An interface for resolving names to executables and library loaders.
///
/// An executable itself is often not sufficient to create a working process
/// because many executables also load shared libraries. On Fuchsia, there is no
/// global pool of shared libraries. Instead, every process has an associated
/// `fuchsia.ldsvc.Loader`, which provides access to a private pool of shared
/// libraries appropriate for that process.
///
/// This interface provides a protocol for resolving a name into both the
/// `zx.handle:VMO` for the executable and the `fuchsia.ldsvc.Loader` for its
/// associated shared libraries.
///
/// This interface is rarely used directly. Instead, `fdio_spawn` and
/// `fdio_spawn_etc` use this interface internally when they try to run a file
/// with a `#!resolve` directive.
[Discoverable, ForDeprecatedCBindings]
protocol Resolver {
    /// Resolves the given `name` to an `executable` and an shared library
    /// loader.
    ///
    /// If present, the `executable` is suitable for use as the `executable`
    /// property of `LaunchInfo` -- in particular, it will have `ZX_RIGHT_EXECUTE`.
    /// If present, the `ldsvc` is suitable for use as the `PA_LDSVC_LOADER`
    /// handle when launching the process.
    ///
    /// For example, the resolver might locate the given `name` inside a package
    /// and return the executable binary from the package as well as a shared
    /// library loader scoped to that package.
    Resolve(string:MAX_RESOLVE_NAME_SIZE name) -> (zx.status status,
                                                   zx.handle:VMO? executable,
                                                   fuchsia.ldsvc.Loader? ldsvc);
};
