blob: 448d9e38d7d15d89cfaec549e8c793913e2b6316 [file] [log] [blame]
// Copyright 2024 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.
#ifndef SRC_DEVICES_BIN_DRIVER_MANAGER_PKG_UTILS_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_PKG_UTILS_H_
#include <fidl/fuchsia.io/cpp/fidl.h>
#include <lib/fdio/directory.h>
#include <lib/zx/result.h>
namespace pkg_utils {
inline zx::result<zx::vmo> OpenPkgFile(fidl::UnownedClientEnd<fuchsia_io::Directory> pkg_dir,
std::string_view relative_binary_path) {
auto [client_end, server_end] = fidl::Endpoints<fuchsia_io::File>::Create();
zx_status_t status = fdio_open3_at(
pkg_dir.channel()->get(), relative_binary_path.data(),
static_cast<uint64_t>(fuchsia_io::wire::kPermReadable | fuchsia_io::wire::kPermExecutable),
server_end.TakeChannel().release());
if (status != ZX_OK) {
return zx::error(status);
}
fidl::SyncClient file(std::move(client_end));
auto result =
file->GetBackingMemory(fuchsia_io::VmoFlags::kRead | fuchsia_io::VmoFlags::kExecute |
fuchsia_io::VmoFlags::kPrivateClone);
if (result.is_error()) {
zx_status_t status = result.error_value().is_domain_error()
? result.error_value().domain_error()
: ZX_ERR_BAD_HANDLE;
return zx::error(status);
}
return zx::ok(std::move(result->vmo()));
}
inline zx::result<fidl::ClientEnd<fuchsia_io::Directory>> OpenLibDir(
fidl::UnownedClientEnd<fuchsia_io::Directory> pkg_dir) {
auto [client_end, server_end] = fidl::Endpoints<fuchsia_io::Directory>::Create();
zx_status_t status = fdio_open3_at(
pkg_dir.channel()->get(), "lib",
static_cast<uint64_t>(fuchsia_io::wire::Flags::kProtocolDirectory |
fuchsia_io::wire::kPermReadable | fuchsia_io::wire::kPermExecutable),
server_end.TakeChannel().release());
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(client_end));
}
} // namespace pkg_utils
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_PKG_UTILS_H_