From a2a99f18d43dbfb76f72fe2771c292b9090e21f0 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Sat, 4 Nov 2017 16:20:48 -0700 Subject: add drive-level verification --- src/bin/geniza-drive.rs | 21 ++++++++------------- src/drive.rs | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/bin/geniza-drive.rs b/src/bin/geniza-drive.rs index dae8294..32104e4 100644 --- a/src/bin/geniza-drive.rs +++ b/src/bin/geniza-drive.rs @@ -1,7 +1,6 @@ // Free Software under GPL-3.0, see LICENSE // Copyright 2017 Bryan Newbold -#[macro_use] extern crate clap; extern crate env_logger; #[macro_use] @@ -34,20 +33,12 @@ fn run() -> Result<()> { SubCommand::with_name("log") .about("History of additions/deletions from this dat") ) + .subcommand( + SubCommand::with_name("verify") + .about("Checks signatures et al") + ) .get_matches(); -/* - mode: ::std::option::Option, - uid: ::std::option::Option, - gid: ::std::option::Option, - size: ::std::option::Option, - blocks: ::std::option::Option, - offset: ::std::option::Option, - byteOffset: ::std::option::Option, - mtime: ::std::option::Option, - ctime: ::std::option::Option, -*/ - let dir = Path::new(matches.value_of("dat-dir").unwrap()); match matches.subcommand() { ("ls", Some(_subm)) => { @@ -75,6 +66,10 @@ fn run() -> Result<()> { } } } + ("verify", Some(_subm)) => { + let mut drive = DatDrive::open(dir, false)?; + println!("{:?}", drive.verify()); + } _ => { println!("Missing or unimplemented command!"); println!("{}", matches.usage()); diff --git a/src/drive.rs b/src/drive.rs index 9826980..73c0744 100644 --- a/src/drive.rs +++ b/src/drive.rs @@ -152,6 +152,30 @@ impl<'a> DatDrive { unimplemented!() } + pub fn read_file_bytes, R: Read>(&mut self, path: P) -> Result> { + let de = self.broken_find_file(path.as_ref())?; + if let Some(entry) = de { + // TODO: read and concatonate chunks + let stat = entry.stat.unwrap(); + let mut buf = vec![]; + let offset = stat.get_offset(); + let blocks = stat.get_blocks(); + for i in offset..(offset+blocks) { + let mut chunk = self.content.get_data_entry(i)?; + buf.append(&mut chunk); + } + return Ok(buf); + } else { + bail!("Couldn't find path: {}", path.as_ref().display()); + } + } + + pub fn verify(&mut self) -> Result<()> { + self.metadata.verify()?; + self.content.verify()?; + Ok(()) + } + /* Possible future helper functions to be even more like std::fs pub fn rename, Q: AsRef>(&mut self, from: P, to: Q) -> Result<()> pub fn copy, Q: AsRef>(&mut self, from: P, to: Q) -> Result<()> -- cgit v1.2.3