diff options
Diffstat (limited to 'src/devices/file_device.rs')
-rw-r--r-- | src/devices/file_device.rs | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/src/devices/file_device.rs b/src/devices/file_device.rs index ff5629b..43bb239 100644 --- a/src/devices/file_device.rs +++ b/src/devices/file_device.rs @@ -16,6 +16,7 @@ pub struct FileDevice { pub pointer_write: u32, pub length_write: u32, + pub enable: bool, pub enable_read: bool, pub enable_write: bool, pub enable_create: bool, @@ -26,6 +27,7 @@ pub struct FileDevice { impl Device for FileDevice { fn read(&mut self, port: u8) -> u8 { + if !self.enable { return 0x00; } match port { 0x0 => read_b!(self.entry.is_some()), 0x1 => read_b!(self.success), @@ -48,6 +50,7 @@ impl Device for FileDevice { } fn write(&mut self, port: u8, value: u8) -> Option<Signal> { + if !self.enable { return None; } match port { 0x0 => self.write_to_entry_port(value), 0x1 => self.write_to_action_port(value), @@ -81,20 +84,35 @@ impl Device for FileDevice { impl FileDevice { - pub fn new() -> Self { + pub fn new(config: &EmulatorConfig) -> Self { #[cfg(target_family = "unix")] let default_base: PathBuf = PathBuf::from("/"); #[cfg(target_family = "windows")] let default_base: PathBuf = PathBuf::from(""); + let current_dir = match std::env::current_dir() { + Ok(dir) => PathBuf::from(dir), + Err(_) => PathBuf::from(""), + }; + + let (enable, base_path, default_path) = if config.trust_files { + (true, default_base, current_dir) + } else if let Some(config_dir) = dirs_next::config_dir() { + let bedrock_dir = config_dir.join("bedrock"); + let identifier = config.identifier.clone().unwrap_or("default".to_string()); + let sandbox_dir = bedrock_dir.join(identifier); + vagabond::make_directory(&sandbox_dir).unwrap(); + (true, sandbox_dir.clone(), sandbox_dir) + } else { + error!("Could not determine sandbox path for file device"); + (false, default_base, current_dir) + }; + // TODO: I'm not at all confident that the default path is correct // when not being set as the current directory. Self { - base_path: default_base, - default_path: match std::env::current_dir() { - Ok(dir) => PathBuf::from(dir), - Err(_) => PathBuf::from(""), - }, + base_path, + default_path, entry_buffer: BedrockPathBuffer::new(), action_buffer: BedrockPathBuffer::new(), @@ -107,6 +125,7 @@ impl FileDevice { pointer_write: 0, length_write: 0, + enable, enable_read: true, enable_write: true, enable_create: true, |