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

using zx;

// See //zircon/docs/program_loading.md for a more complete
// description of this and related process bootstrapping protocols, and
// for specifics about the default global loader service's
// interpretation of names, paths, and configurations.

// WARNING: This interface is manually implemented in libldmsg.a. Please
// update that implementation if you change this protocol.

[Layout = "Simple"]
interface Loader {
    // Cleanly shutdown the connection to the Loader service.
    1: Done();

    // The dynamic linker sends |object_name| and gets back a VMO
    // handle containing the file.
    2: LoadObject(string:1024 object_name) -> (zx.status rv, handle<vmo>? object);

    // The program loader sends the script |interpreter_name| from
    // hashbang and gets back a VMO to execute in place of the script.
    3: LoadScriptInterpreter(string:1024 interpreter_name) -> (zx.status rv, handle<vmo>? object);

    // The dynamic linker sends a |config| identifying its load
    // configuration.  This is intended to affect how later
    // |LoadObject| requests decide what particular implementation
    // file to supply for a given name.
    4: Config(string:1024 config) -> (zx.status rv);

    // Obtain a new loader service connection.
    5: Clone(request<Loader> loader) -> (zx.status rv);

    // The program runtime sends a string naming a |data_sink| and
    // transfers the sole handle to a VMO containing the |data| it
    // wants published there.  The |data_sink| string identifies a
    // type of data, and the VMO's object name can specifically
    // identify the data set in this VMO.  The client must transfer
    // the only handle to the VMO (which prevents the VMO being
    // resized without the receiver's knowledge), but it might still
    // have the VMO mapped in and continue to write data to it.  Code
    // instrumentation runtimes use this to deliver large binary trace
    // results.
    //
    // This is intended to be a developer-oriented feature and might
    // not ordinarily be available in production runs.
    7: DebugPublishDataSink(string:1024 data_sink, handle<vmo> data) -> (zx.status rv);

    // The program runtime names a |config_name| referring to a debug
    // configuration of some kind and gets back a VMO to read
    // configuration data from.  The sanitizer runtimes use this to
    // allow large options text to be stored in a file rather than
    // passed directly in environment strings.
    //
    // This is intended to be a developer-oriented feature and might
    // not ordinarily be available in production runs.
    8: DebugLoadConfig(string:1024 config_name) -> (zx.status rv, handle<vmo>? config);
};
