blob: 8ef018ee9a3fb3cddaddc4894c57ca4683e7d851 [file] [log] [blame]
// Copyright 2017 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.
#pragma once
#include <zircon/compiler.h>
#include <zircon/types.h>
__BEGIN_CDECLS
typedef struct async_dispatcher async_dispatcher_t; // From <lib/async/dispatcher.h>
// These functions provide an implementation of the shared library loading
// service. See system/fidl/fuchsia-ldsvc/ldsvc.fidl for a definition of the protocol.
//
// These implementations are compatible with |dl_set_loader_service| and are
// primarily used by devmgr, fshost, and appmgr to provide shared libraries to
// the processes they create.
//
// Terms:
//
// "loader service": A channel that speaks the protocol expected by
// dl_set_loader_service(). The service behind the channel receives
// load requests (e.g., "libhid.so") and returns VMOs that contain
// the data associated with that name.
// "system loader service": A loader service, provided by the system,
// that is shared by multiple processes.
typedef struct loader_service loader_service_t;
// Create a new file-system backed loader service capable of handling
// any number of clients.
//
// Requests will be processed on the given |async|. If |async| is NULL, this
// library will create a new thread and listen for requests on that thread.
zx_status_t loader_service_create_fs(async_dispatcher_t* dispatcher, loader_service_t** out);
// Create a new file-descriptor backed loader service capable of handling any
// number of clients.
//
// Requests will be processed on the given |async|. If |async| is NULL, this
// library will create a new thread and listen for requests on that thread.
// Paths and objects will be loaded relative to |root_dir_fd|, and the loader
// service will take ownership of |root_dir_fd|.
zx_status_t loader_service_create_fd(async_dispatcher_t* dispatcher,
int root_dir_fd,
loader_service_t** out);
// Returns a new dl_set_loader_service-compatible loader service channel.
zx_status_t loader_service_connect(loader_service_t* svc, zx_handle_t* out);
// Same as connect except caller provides the channel endpoint (which
// is connected on success, closed on failure).
zx_status_t loader_service_attach(loader_service_t* svc, zx_handle_t channel);
typedef struct loader_service_ops {
// attempt to load a shared library from suitable library paths.
zx_status_t (*load_object)(void* ctx, const char* name, zx_handle_t* vmo);
// attempt to load a script interpreter or debug config file
zx_status_t (*load_abspath)(void* ctx, const char* path, zx_handle_t* vmo);
// attempt to publish a data sink
// takes ownership of the provided vmo on both success and failure.
zx_status_t (*publish_data_sink)(void* ctx, const char* name, zx_handle_t vmo);
// finalize the loader service (optional)
// called shortly before the loader service is destroyed
void (*finalizer)(void* ctx);
} loader_service_ops_t;
// Create a loader service backed by custom loader ops.
//
// Requests will be processed on the given |async|. If |async| is NULL, this
// library will create a new thread and listen for requests on that thread.
zx_status_t loader_service_create(async_dispatcher_t* dispatcher,
const loader_service_ops_t* ops,
void* ctx,
loader_service_t** out);
// After this function returns, |svc| will destroy itself once there are no
// longer any outstanding connections.
//
// The |finalizer| in |loader_service_ops_t| will be called shortly before |svc|
// destroys itself.
zx_status_t loader_service_release(loader_service_t* svc);
__END_CDECLS