Skip to main content

starnix_container_structured_config/
starnix_container_structured_config_rust_config_lib_source.rs

1use fidl::unpersist;
2use fidl_cf_sc_internal_starnixcontainerstructuredconfig::Config as FidlConfig;
3use fuchsia_component_config::{Config as ComponentConfig, Error};
4use fuchsia_inspect::{ArrayProperty, Node};
5use std::convert::TryInto;
6const EXPECTED_CHECKSUM: &[u8] = &[
7    0x01, 0x2b, 0x23, 0xa7, 0xaa, 0x16, 0x78, 0xa4, 0x9b, 0x43, 0x5f, 0x35, 0x83, 0x1b, 0x89, 0x2e,
8    0x07, 0x18, 0x8c, 0x6b, 0xef, 0x20, 0xfd, 0x7b, 0x3e, 0xe6, 0x2b, 0xf3, 0xe6, 0xb2, 0x93, 0x9e,
9];
10const EXPECTED_CHECKSUM_LENGTH: [u8; 2] = (EXPECTED_CHECKSUM.len() as u16).to_le_bytes();
11#[derive(Debug)]
12pub struct Config {
13    pub additional_mounts: Vec<String>,
14    pub cached_zx_map_info_bytes: u32,
15    pub crash_report_throttling: bool,
16    pub dirent_cache_size: u32,
17    pub enable_utc_time_adjustment: bool,
18    pub extra_features: Vec<String>,
19    pub initial_view_id_annotation: String,
20    pub mlock_always_onfault: bool,
21    pub mlock_pin_flavor: String,
22    pub selinux_exceptions: Vec<String>,
23    pub ui_visual_debugging_level: u8,
24}
25impl Config {
26    #[doc = r" Take the config startup handle and parse its contents."]
27    #[doc = r""]
28    #[doc = r" # Panics"]
29    #[doc = r""]
30    #[doc = r" If the config startup handle was already taken or if it is not valid."]
31    pub fn take_from_startup_handle() -> Self {
32        <Self as ComponentConfig>::take_from_startup_handle()
33    }
34    #[doc = r" Parse `Self` from `vmo`."]
35    pub fn from_vmo(vmo: &zx::Vmo) -> Result<Self, Error> {
36        <Self as ComponentConfig>::from_vmo(vmo)
37    }
38    #[doc = r" Parse `Self` from `bytes`."]
39    pub fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
40        <Self as ComponentConfig>::from_bytes(bytes)
41    }
42    pub fn record_inspect(&self, inspector_node: &Node) {
43        <Self as ComponentConfig>::record_inspect(self, inspector_node)
44    }
45}
46impl ComponentConfig for Config {
47    #[doc = r" Parse `Self` from `bytes`."]
48    fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
49        let (checksum_len_bytes, bytes) = bytes.split_at_checked(2).ok_or(Error::TooFewBytes)?;
50        let checksum_len_bytes: [u8; 2] =
51            checksum_len_bytes.try_into().expect("previous call guaranteed 2 element slice");
52        let checksum_length = u16::from_le_bytes(checksum_len_bytes) as usize;
53        let (observed_checksum, bytes) =
54            bytes.split_at_checked(checksum_length).ok_or(Error::TooFewBytes)?;
55        if observed_checksum != EXPECTED_CHECKSUM {
56            return Err(Error::ChecksumMismatch {
57                expected_checksum: EXPECTED_CHECKSUM.to_vec(),
58                observed_checksum: observed_checksum.to_vec(),
59            });
60        }
61        let fidl_config: FidlConfig = unpersist(bytes).map_err(Error::Unpersist)?;
62        Ok(Self {
63            additional_mounts: fidl_config.additional_mounts,
64            cached_zx_map_info_bytes: fidl_config.cached_zx_map_info_bytes,
65            crash_report_throttling: fidl_config.crash_report_throttling,
66            dirent_cache_size: fidl_config.dirent_cache_size,
67            enable_utc_time_adjustment: fidl_config.enable_utc_time_adjustment,
68            extra_features: fidl_config.extra_features,
69            initial_view_id_annotation: fidl_config.initial_view_id_annotation,
70            mlock_always_onfault: fidl_config.mlock_always_onfault,
71            mlock_pin_flavor: fidl_config.mlock_pin_flavor,
72            selinux_exceptions: fidl_config.selinux_exceptions,
73            ui_visual_debugging_level: fidl_config.ui_visual_debugging_level,
74        })
75    }
76    fn to_bytes(&self) -> Result<Vec<u8>, Error> {
77        let fidl_config = FidlConfig {
78            additional_mounts: self.additional_mounts.clone(),
79            cached_zx_map_info_bytes: self.cached_zx_map_info_bytes.clone(),
80            crash_report_throttling: self.crash_report_throttling.clone(),
81            dirent_cache_size: self.dirent_cache_size.clone(),
82            enable_utc_time_adjustment: self.enable_utc_time_adjustment.clone(),
83            extra_features: self.extra_features.clone(),
84            initial_view_id_annotation: self.initial_view_id_annotation.clone(),
85            mlock_always_onfault: self.mlock_always_onfault.clone(),
86            mlock_pin_flavor: self.mlock_pin_flavor.clone(),
87            selinux_exceptions: self.selinux_exceptions.clone(),
88            ui_visual_debugging_level: self.ui_visual_debugging_level.clone(),
89        };
90        let mut fidl_bytes = fidl::persist(&fidl_config).map_err(Error::Persist)?;
91        let mut bytes = Vec::with_capacity(
92            EXPECTED_CHECKSUM_LENGTH.len() + EXPECTED_CHECKSUM.len() + fidl_bytes.len(),
93        );
94        bytes.extend_from_slice(&EXPECTED_CHECKSUM_LENGTH);
95        bytes.extend_from_slice(EXPECTED_CHECKSUM);
96        bytes.append(&mut fidl_bytes);
97        Ok(bytes)
98    }
99    fn record_inspect(&self, inspector_node: &Node) {
100        let arr =
101            inspector_node.create_string_array("additional_mounts", self.additional_mounts.len());
102        for i in 0..self.additional_mounts.len() {
103            arr.set(i, &self.additional_mounts[i]);
104        }
105        inspector_node.record(arr);
106        inspector_node
107            .record_uint("cached_zx_map_info_bytes", self.cached_zx_map_info_bytes as u64);
108        inspector_node.record_bool("crash_report_throttling", self.crash_report_throttling);
109        inspector_node.record_uint("dirent_cache_size", self.dirent_cache_size as u64);
110        inspector_node.record_bool("enable_utc_time_adjustment", self.enable_utc_time_adjustment);
111        let arr = inspector_node.create_string_array("extra_features", self.extra_features.len());
112        for i in 0..self.extra_features.len() {
113            arr.set(i, &self.extra_features[i]);
114        }
115        inspector_node.record(arr);
116        inspector_node
117            .record_string("initial_view_id_annotation", &self.initial_view_id_annotation);
118        inspector_node.record_bool("mlock_always_onfault", self.mlock_always_onfault);
119        inspector_node.record_string("mlock_pin_flavor", &self.mlock_pin_flavor);
120        let arr =
121            inspector_node.create_string_array("selinux_exceptions", self.selinux_exceptions.len());
122        for i in 0..self.selinux_exceptions.len() {
123            arr.set(i, &self.selinux_exceptions[i]);
124        }
125        inspector_node.record(arr);
126        inspector_node
127            .record_uint("ui_visual_debugging_level", self.ui_visual_debugging_level as u64);
128    }
129}