From 3845bb8ba17a9f3c9ccc92e1387b4fa279b78136 Mon Sep 17 00:00:00 2001 From: Theron Date: Sun, 1 Mar 2020 17:47:43 -0600 Subject: [PATCH] file signature check --- src/cartridge/mod.rs | 16 +++++++++++++++- src/main.rs | 10 +++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/cartridge/mod.rs b/src/cartridge/mod.rs index c49db90..1059c0c 100644 --- a/src/cartridge/mod.rs +++ b/src/cartridge/mod.rs @@ -11,8 +11,11 @@ use cnrom::Cnrom; use mmc3::Mmc3; use std::cell::RefCell; -use std::rc::Rc; +use std::fs::File; +use std::io; +use std::io::prelude::*; use std::io::Read; +use std::rc::Rc; pub trait Mapper { fn read(&self, address: usize) -> u8; @@ -108,6 +111,17 @@ impl Cartridge { } +pub fn check_signature(filename: &str) -> Result<(), String> { + let mut f = File::open(filename).map_err(|e| e.to_string())?; + let mut data = [0; 4]; + f.read_exact(&mut data).map_err(|e| e.to_string())?; + if data == [0x4E, 0x45, 0x53, 0x1A] { + Ok(()) + } else { + Err("file signature mismatch: not a valid iNES file".to_string()) + } +} + /* The mappings above are the fixed addresses from which the PPU uses to fetch data during rendering. The actual device that the PPU fetches data from, however, may be configured by the cartridge. $0000-1FFF is normally mapped by the cartridge to a CHR-ROM or CHR-RAM, often with a bank switching mechanism. diff --git a/src/main.rs b/src/main.rs index 7064b9d..0370ccc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ mod state; use cpu::Cpu; use ppu::Ppu; use apu::Apu; -use cartridge::get_mapper; +use cartridge::{check_signature, get_mapper}; use input::poll_buttons; use screen::{init_window, draw_pixel, draw_to_window}; use state::{save_state, load_state, find_next_filename, find_last_filename}; @@ -203,8 +203,12 @@ fn process_events(event_pump: &mut EventPump, filepath: &PathBuf, cpu: &mut Cpu) let res: Result<(), String> = load_state(cpu, &p) .or_else(|e| {println!("{}", e); Ok(())}); res.unwrap(); - } else if f.len() > 4 && &f[f.len()-4..] == ".nes" { - return GameExitMode::NewGame(f) + // } else if f.len() > 4 && &f[f.len()-4..] == ".nes" { + } else { + match cartridge::check_signature(&f) { + Ok(()) => return GameExitMode::NewGame(f), + Err(e) => println!("{}", e), + } } }, _ => (),