From 85bf7a1d19ae00ec20268d4dcd7ec02a7629ae36 Mon Sep 17 00:00:00 2001 From: Allison Karlitskaya Date: Thu, 10 Oct 2024 16:34:43 +0200 Subject: [PATCH] oci: split 'get_entry()' out of 'ls' command This lets us read a single composefs dumpfile Entry out of the split stream. This is going to be the basis of merging entries from multiple streams. 'ls' is now a positively trivial loop around get_entry() until EOF. --- src/oci/tar.rs | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/oci/tar.rs b/src/oci/tar.rs index fac956d..b9f1a69 100644 --- a/src/oci/tar.rs +++ b/src/oci/tar.rs @@ -127,8 +127,7 @@ fn symlink_target_from_tar(pax: Option>, gnu: Vec, short: &[u8]) -> } } -pub fn ls(split_stream: &mut R) -> Result<()> { - let mut reader = SplitStreamReader::new(split_stream); +fn get_entry(reader: &mut SplitStreamReader) -> Result>> { let mut gnu_longlink: Vec = vec![]; let mut gnu_longname: Vec = vec![]; let mut pax_longlink: Option> = None; @@ -148,12 +147,8 @@ pub fn ls(split_stream: &mut R) -> Result<()> { loop { let mut buf = [0u8; 512]; - if !reader.read_inline_exact(&mut buf)? { - return Ok(()); - } - - if buf == [0u8; 512] { - return Ok(()); + if !reader.read_inline_exact(&mut buf)? || buf == [0u8; 512] { + return Ok(None); } let header = tar::Header::from_byte_slice(&buf); @@ -252,7 +247,7 @@ pub fn ls(split_stream: &mut R) -> Result<()> { }, }.as_raw_mode(); - let entry = Entry { + return Ok(Some(Entry { path: Cow::Owned(path_from_tar(pax_longname, gnu_longname, &header.path_bytes())), uid: header.uid()? as u32, gid: header.gid()? as u32, @@ -260,14 +255,14 @@ pub fn ls(split_stream: &mut R) -> Result<()> { mtime: Mtime { sec: header.mtime()?, nsec: 0 }, item, xattrs - }; + })); + } +} +pub fn ls(split_stream: &mut R) -> Result<()> { + let mut reader = SplitStreamReader::new(split_stream); + while let Some(entry) = get_entry(&mut reader)? { println!("{}", entry); - - gnu_longlink = vec![]; - gnu_longname = vec![]; - pax_longlink = None; - pax_longname = None; - xattrs = vec![]; } + Ok(()) }