blob: 18f776aea78b7909073fb9d03a5e58d35a1b7493 [file] [log] [blame]
// Copyright 2020 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.
use anyhow::Context;
use futures::TryStreamExt;
use {
fidl_fuchsia_io as fio,
fidl_fuchsia_pkg::PackageResolverRequestStream,
fuchsia_url::{PackageVariant, UnpinnedAbsolutePackageUrl},
futures::StreamExt,
};
pub async fn serve(stream: PackageResolverRequestStream) -> anyhow::Result<()> {
stream
.map(|result| result.context("failed request"))
.try_for_each(|request| async {
match request {
fidl_fuchsia_pkg::PackageResolverRequest::Resolve {
package_url,
dir,
responder,
} => {
let package_url = UnpinnedAbsolutePackageUrl::parse(&package_url)?;
let flags = fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::DIRECTORY;
fuchsia_fs::node::connect_in_namespace(
&format!(
"/pkgfs/packages/{}/{}",
package_url.name(),
package_url
.variant()
.cloned()
.unwrap_or_else(|| PackageVariant::zero())
),
flags,
dir.into_channel(),
)?;
responder.send(&mut Ok(())).context("error sending response")?;
}
fidl_fuchsia_pkg::PackageResolverRequest::GetHash { package_url: _, responder } => {
responder
.send(&mut Err(fuchsia_zircon::sys::ZX_ERR_UNAVAILABLE))
.context("error sending response")?;
}
}
Ok(())
})
.await?;
Ok(())
}