1use crate::directory::entry_container::Directory;
8use crate::execution_scope::ExecutionScope;
9use crate::object_request::ToObjectRequest as _;
10use crate::path::Path;
11use fidl::endpoints::ServerEnd;
12use fidl_fuchsia_io as fio;
13use std::sync::Arc;
14
15#[cfg(test)]
16#[macro_use]
17pub(crate) mod test_utils;
18
19pub mod common;
20
21pub mod immutable;
22pub mod mutable;
23
24mod connection;
25pub mod dirents_sink;
26pub mod entry;
27pub mod entry_container;
28pub mod helper;
29pub mod read_dirents;
30pub mod simple;
31pub mod traversal_position;
32pub mod watchers;
33
34#[derive(Clone)]
36pub struct DirectoryOptions {
37 pub(crate) rights: fio::Operations,
38}
39
40impl DirectoryOptions {
41 pub(crate) fn to_io1(&self) -> fio::OpenFlags {
42 let mut flags = fio::OpenFlags::empty();
47 if self.rights.contains(fio::R_STAR_DIR) {
48 flags |= fio::OpenFlags::RIGHT_READABLE;
49 }
50 if self.rights.contains(fio::W_STAR_DIR) {
51 flags |= fio::OpenFlags::RIGHT_WRITABLE;
52 }
53 if self.rights.contains(fio::X_STAR_DIR) {
54 flags |= fio::OpenFlags::RIGHT_EXECUTABLE;
55 }
56 flags
57 }
58}
59
60impl From<&DirectoryOptions> for fio::Flags {
61 fn from(options: &DirectoryOptions) -> Self {
62 fio::Flags::PROTOCOL_DIRECTORY | fio::Flags::from_bits_truncate(options.rights.bits())
64 }
65}
66
67impl Default for DirectoryOptions {
68 fn default() -> Self {
69 DirectoryOptions { rights: fio::R_STAR_DIR }
70 }
71}
72
73pub fn serve<D: Directory + ?Sized>(directory: Arc<D>, flags: fio::Flags) -> fio::DirectoryProxy {
77 crate::serve_directory(directory, Path::dot(), flags)
78}
79
80pub fn serve_read_only<D: Directory + ?Sized>(directory: Arc<D>) -> fio::DirectoryProxy {
84 crate::serve_directory(directory, Path::dot(), fio::PERM_READABLE)
85}
86
87pub fn serve_on<D: Directory + ?Sized>(
90 directory: Arc<D>,
91 flags: fio::Flags,
92 scope: ExecutionScope,
93 server_end: ServerEnd<fio::DirectoryMarker>,
94) {
95 let request = flags.to_object_request(server_end);
96 request.handle(|request| directory.open(scope, Path::dot(), flags, request));
97}