blob: 728f570aa6d99259973bc4d420341fcc2fb7312f [file] [log] [blame] [edit]
// Copyright 2021 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.
#include "src/devices/misc/drivers/compat/loader.h"
#include <lib/async/default.h>
#include <lib/zx/vmo.h>
namespace compat {
namespace fio = fuchsia_io;
Loader::Loader(fidl::UnownedClientEnd<fuchsia_ldsvc::Loader> loader, OverrideMap overrides)
: dispatcher_(async_get_default_dispatcher()),
client_(loader),
overrides_(std::move(overrides)) {}
void Loader::Bind(fidl::ServerEnd<fuchsia_ldsvc::Loader> request) {
bindings_.AddBinding(dispatcher_, std::move(request), this, fidl::kIgnoreBindingClosure);
}
void Loader::Done(DoneCompleter::Sync& completer) { completer.Close(ZX_OK); }
void Loader::LoadObject(LoadObjectRequestView request, LoadObjectCompleter::Sync& completer) {
// When there is a request for an overriden library return the override instead.
if (auto file = overrides_.find(std::string(request->object_name.get()));
file != overrides_.end()) {
auto result = fidl::Call(file->second)
->GetBackingMemory(fio::VmoFlags::kRead | fio::VmoFlags::kExecute |
fio::VmoFlags::kPrivateClone);
if (!result.is_ok()) {
zx_status_t status = result.error_value().is_domain_error()
? result.error_value().domain_error()
: result.error_value().framework_error().status();
completer.Reply(status, zx::vmo());
return;
}
completer.Reply(ZX_OK, std::move(result->vmo()));
return;
}
fidl::WireResult result = fidl::WireCall(client_)->LoadObject(request->object_name);
if (!result.ok()) {
completer.Reply(result.status(), {});
return;
}
completer.Reply(result->rv, std::move(result->object));
}
void Loader::Config(ConfigRequestView request, ConfigCompleter::Sync& completer) {
fidl::WireResult result = fidl::WireCall(client_)->Config(request->config);
if (!result.ok()) {
completer.Reply(result.status());
return;
}
completer.Reply(result->rv);
}
void Loader::Clone(CloneRequestView request, CloneCompleter::Sync& completer) {
bindings_.AddBinding(dispatcher_, std::move(request->loader), this, fidl::kIgnoreBindingClosure);
completer.Reply(ZX_OK);
}
} // namespace compat