starnix_container_structured_config/
starnix_container_structured_config_rust_config_lib_source.rs1use 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}