diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2017-11-04 16:20:48 -0700 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2017-11-04 16:20:48 -0700 |
commit | a2a99f18d43dbfb76f72fe2771c292b9090e21f0 (patch) | |
tree | 2d83a90871a19bbfd19b40a86ad25cc3ce7f904c /src/drive.rs | |
parent | 370b8bb96764ea71f52650440a60a4cabc7bcf63 (diff) | |
download | geniza-a2a99f18d43dbfb76f72fe2771c292b9090e21f0.tar.gz geniza-a2a99f18d43dbfb76f72fe2771c292b9090e21f0.zip |
add drive-level verification
Diffstat (limited to 'src/drive.rs')
-rw-r--r-- | src/drive.rs | 24 |
1 files changed, 24 insertions, 0 deletions
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<P: AsRef<Path>, R: Read>(&mut self, path: P) -> Result<Vec<u8>> { + 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<P: AsRef<Path>, Q: AsRef<Path>>(&mut self, from: P, to: Q) -> Result<()> pub fn copy<P: AsRef<Path>, Q: AsRef<Path>>(&mut self, from: P, to: Q) -> Result<()> |