// 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.
@available(added=7)
library fuchsia.ldsvc;

using zx;

// WARNING: This interface is manually implemented in libldmsg.a. Please
// update that implementation if you change this protocol.
/// See //docs/concepts/process/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.
closed protocol Loader {
    /// Cleanly shutdown the connection to the Loader service.
    strict Done();

    /// The dynamic linker sends `object_name` and gets back a VMO
    /// handle containing the file.
    strict LoadObject(struct {
        object_name string:1024;
    }) -> (resource struct {
        rv zx.Status;
        object zx.Handle:<VMO, optional>;
    });

    /// 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.
    strict Config(struct {
        config string:1024;
    }) -> (struct {
        rv zx.Status;
    });

    /// Obtain a new loader service connection.
    strict Clone(resource struct {
        loader server_end:Loader;
    }) -> (struct {
        rv zx.Status;
    });
};
