summaryrefslogtreecommitdiff
path: root/src/devices/file_device.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/file_device.rs')
-rw-r--r--src/devices/file_device.rs31
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,