aboutsummaryrefslogtreecommitdiffstats
path: root/src/drive.rs
diff options
context:
space:
mode:
authorBryan Newbold <bnewbold@robocracy.org>2017-11-04 16:20:48 -0700
committerBryan Newbold <bnewbold@robocracy.org>2017-11-04 16:20:48 -0700
commita2a99f18d43dbfb76f72fe2771c292b9090e21f0 (patch)
tree2d83a90871a19bbfd19b40a86ad25cc3ce7f904c /src/drive.rs
parent370b8bb96764ea71f52650440a60a4cabc7bcf63 (diff)
downloadgeniza-a2a99f18d43dbfb76f72fe2771c292b9090e21f0.tar.gz
geniza-a2a99f18d43dbfb76f72fe2771c292b9090e21f0.zip
add drive-level verification
Diffstat (limited to 'src/drive.rs')
-rw-r--r--src/drive.rs24
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<()>