From dd8428b44fbae92d538cefd01df22b2c85deb4b4 Mon Sep 17 00:00:00 2001 From: Wesley Hershberger <mggmugginsmc@gmail.com> Date: Mon, 3 Aug 2020 21:45:38 -0400 Subject: [PATCH] Implement PackageBuf --- pkgar-core/src/lib.rs | 2 +- pkgar-core/src/package.rs | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pkgar-core/src/lib.rs b/pkgar-core/src/lib.rs index 1b4ed83..2ad84be 100644 --- a/pkgar-core/src/lib.rs +++ b/pkgar-core/src/lib.rs @@ -6,7 +6,7 @@ use core::mem; pub use crate::entry::Entry; pub use crate::error::Error; pub use crate::header::Header; -pub use crate::package::PackageSrc; +pub use crate::package::{PackageBuf, PackageSrc}; mod entry; mod error; diff --git a/pkgar-core/src/package.rs b/pkgar-core/src/package.rs index 811b1ca..b7439ca 100644 --- a/pkgar-core/src/package.rs +++ b/pkgar-core/src/package.rs @@ -1,6 +1,6 @@ use alloc::vec; use alloc::vec::Vec; -use core::convert::{AsRef, TryFrom}; +use core::convert::TryFrom; use sodiumoxide::crypto::sign::PublicKey; @@ -58,17 +58,35 @@ pub trait PackageSrc { } } -impl<T: AsRef<[u8]>> PackageSrc for T { +//TODO: Test this impl... +pub struct PackageBuf<'a> { + src: &'a [u8], + header: Header, +} + +impl<'a> PackageBuf<'a> { + pub fn new(src: &'a [u8], public_key: &PublicKey) -> Result<PackageBuf<'a>, Error> { + let zeroes = [0; HEADER_SIZE]; + let mut new = PackageBuf { + src, + header: unsafe { *Header::new_unchecked(&zeroes)? }, + }; + new.header = *Header::new(&new.src, &public_key)?; + Ok(new) + } +} + +impl PackageSrc for PackageBuf<'_> { type Err = Error; fn header(&self) -> Header { - panic!("Temporary..."); + self.header } fn read_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize, Error> { let start = usize::try_from(offset) .map_err(Error::TryFromInt)?; - let len = self.as_ref().len(); + let len = self.src.len(); if start >= len { return Ok(0); } @@ -77,7 +95,7 @@ impl<T: AsRef<[u8]>> PackageSrc for T { if end > len { end = len; } - buf.copy_from_slice(&self.as_ref()[start..end]); + buf.copy_from_slice(&self.src[start..end]); Ok(end.checked_sub(start).unwrap()) } } -- GitLab