pub struct Entry<R: Read + Unpin> { /* private fields */ }
Expand description
A read-only view into an entry of an archive.
This structure is a window into a portion of a borrowed archive which can be inspected. It acts as a file handle by implementing the Reader trait. An entry cannot be rewritten once inserted into an archive.
Implementations§
source§impl<R: Read + Unpin> Entry<R>
impl<R: Read + Unpin> Entry<R>
sourcepub fn path(&self) -> Result<Cow<'_, Path>>
pub fn path(&self) -> Result<Cow<'_, Path>>
Returns the path name for this entry.
This method may fail if the pathname is not valid Unicode and this is called on a Windows platform.
Note that this function will convert any \
characters to directory
separators, and it will not always return the same value as
self.header().path()
as some archive formats have support for longer
path names described in separate entries.
It is recommended to use this method instead of inspecting the header
directly to ensure that various archive formats are handled correctly.
sourcepub fn path_bytes(&self) -> Cow<'_, [u8]>
pub fn path_bytes(&self) -> Cow<'_, [u8]>
Returns the raw bytes listed for this entry.
Note that this function will convert any \
characters to directory
separators, and it will not always return the same value as
self.header().path_bytes()
as some archive formats have support for
longer path names described in separate entries.
sourcepub fn link_name(&self) -> Result<Option<Cow<'_, Path>>>
pub fn link_name(&self) -> Result<Option<Cow<'_, Path>>>
Returns the link name for this entry, if any is found.
This method may fail if the pathname is not valid Unicode and this is
called on a Windows platform. Ok(None)
being returned, however,
indicates that the link name was not present.
Note that this function will convert any \
characters to directory
separators, and it will not always return the same value as
self.header().link_name()
as some archive formats have support for
longer path names described in separate entries.
It is recommended to use this method instead of inspecting the header
directly to ensure that various archive formats are handled correctly.
sourcepub fn link_name_bytes(&self) -> Option<Cow<'_, [u8]>>
pub fn link_name_bytes(&self) -> Option<Cow<'_, [u8]>>
Returns the link name for this entry, in bytes, if listed.
Note that this will not always return the same value as
self.header().link_name_bytes()
as some archive formats have support for
longer path names described in separate entries.
sourcepub async fn pax_extensions(&mut self) -> Result<Option<PaxExtensions<'_>>>
pub async fn pax_extensions(&mut self) -> Result<Option<PaxExtensions<'_>>>
Returns an iterator over the pax extensions contained in this entry.
Pax extensions are a form of archive where extra metadata is stored in key/value pairs in entries before the entry they’re intended to describe. For example this can be used to describe long file name or other metadata like atime/ctime/mtime in more precision.
The returned iterator will yield key/value pairs for each extension.
None
will be returned if this entry does not indicate that it itself
contains extensions, or if there were no previous extensions describing
it.
Note that global pax extensions are intended to be applied to all archive entries.
Also note that this function will read the entire entry if the entry itself is a list of extensions.
sourcepub fn header(&self) -> &Header
pub fn header(&self) -> &Header
Returns access to the header of this entry in the archive.
This provides access to the metadata for this entry in the archive.
sourcepub fn raw_header_position(&self) -> u64
pub fn raw_header_position(&self) -> u64
Returns the starting position, in bytes, of the header of this entry in the archive.
The header is always a contiguous section of 512 bytes, so if the
underlying reader implements Seek
, then the slice from header_pos
to
header_pos + 512
contains the raw header bytes.
sourcepub fn raw_file_position(&self) -> u64
pub fn raw_file_position(&self) -> u64
Returns the starting position, in bytes, of the file of this entry in the archive.
If the file of this entry is continuous (e.g. not a sparse file), and
if the underlying reader implements Seek
, then the slice from
file_pos
to file_pos + entry_size
contains the raw file bytes.
sourcepub async fn unpack<P: AsRef<Path>>(&mut self, dst: P) -> Result<Unpacked>
pub async fn unpack<P: AsRef<Path>>(&mut self, dst: P) -> Result<Unpacked>
Writes this file to the specified location.
This function will write the entire contents of this file into the
location specified by dst
. Metadata will also be propagated to the
path dst
.
This function will create a file at the path dst
, and it is required
that the intermediate directories are created. Any existing file at the
location dst
will be overwritten.
Note: This function does not have as many sanity checks as
Archive::unpack
orEntry::unpack_in
. As a result if you’re thinking of unpacking untrusted tarballs you may want to review the implementations of the previous two functions and perhaps implement similar logic yourself.
Examples
use tokio::fs::File;
use tokio_tar::Archive;
use tokio_stream::*;
let mut ar = Archive::new(File::open("foo.tar").await?);
let mut entries = ar.entries()?;
let mut i = 0;
while let Some(file) = entries.next().await {
let mut file = file?;
file.unpack(format!("file-{}", i)).await?;
i += 1;
}
sourcepub async fn unpack_in<P: AsRef<Path>>(&mut self, dst: P) -> Result<bool>
pub async fn unpack_in<P: AsRef<Path>>(&mut self, dst: P) -> Result<bool>
Extracts this file under the specified path, avoiding security issues.
This function will write the entire contents of this file into the
location obtained by appending the path of this file in the archive to
dst
, creating any intermediate directories if needed. Metadata will
also be propagated to the path dst
. Any existing file at the location
dst
will be overwritten.
This function carefully avoids writing outside of dst
. If the file has
a ‘..’ in its path, this function will skip it and return false.
Examples
use tokio::{fs::File, stream::*};
use tokio_tar::Archive;
use tokio_stream::*;
let mut ar = Archive::new(File::open("foo.tar").await?);
let mut entries = ar.entries()?;
let mut i = 0;
while let Some(file) = entries.next().await {
let mut file = file.unwrap();
file.unpack_in("target").await?;
i += 1;
}
sourcepub fn set_unpack_xattrs(&mut self, unpack_xattrs: bool)
pub fn set_unpack_xattrs(&mut self, unpack_xattrs: bool)
Indicate whether extended file attributes (xattrs on Unix) are preserved when unpacking this entry.
This flag is disabled by default and is currently only implemented on Unix using xattr support. This may eventually be implemented for Windows, however, if other archive implementations are found which do this as well.
sourcepub fn set_preserve_permissions(&mut self, preserve: bool)
pub fn set_preserve_permissions(&mut self, preserve: bool)
Indicate whether extended permissions (like suid on Unix) are preserved when unpacking this entry.
This flag is disabled by default and is currently only implemented on Unix.
sourcepub fn set_preserve_mtime(&mut self, preserve: bool)
pub fn set_preserve_mtime(&mut self, preserve: bool)
Indicate whether access time information is preserved when unpacking this entry.
This flag is enabled by default.
Trait Implementations§
Auto Trait Implementations§
impl<R> !RefUnwindSafe for Entry<R>
impl<R> Send for Entry<R>where R: Send,
impl<R> Sync for Entry<R>where R: Send + Sync,
impl<R> Unpin for Entry<R>
impl<R> !UnwindSafe for Entry<R>
Blanket Implementations§
source§impl<R> AsyncReadExt for Rwhere
R: AsyncRead + ?Sized,
impl<R> AsyncReadExt for Rwhere R: AsyncRead + ?Sized,
source§fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where
Self: Unpin,
fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where Self: Unpin,
source§fn read_buf<B, 'a>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>where
Self: Sized + Unpin,
B: BufMut,
fn read_buf<B, 'a>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>where Self: Sized + Unpin, B: BufMut,
source§fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where
Self: Unpin,
fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where Self: Unpin,
buf
. Read moresource§fn read_u8<'a>(&'a mut self) -> ReadU8<&'a mut Self>where
Self: Unpin,
fn read_u8<'a>(&'a mut self) -> ReadU8<&'a mut Self>where Self: Unpin,
source§fn read_i8<'a>(&'a mut self) -> ReadI8<&'a mut Self>where
Self: Unpin,
fn read_i8<'a>(&'a mut self) -> ReadI8<&'a mut Self>where Self: Unpin,
source§fn read_u16<'a>(&'a mut self) -> ReadU16<&'a mut Self>where
Self: Unpin,
fn read_u16<'a>(&'a mut self) -> ReadU16<&'a mut Self>where Self: Unpin,
source§fn read_i16<'a>(&'a mut self) -> ReadI16<&'a mut Self>where
Self: Unpin,
fn read_i16<'a>(&'a mut self) -> ReadI16<&'a mut Self>where Self: Unpin,
source§fn read_u32<'a>(&'a mut self) -> ReadU32<&'a mut Self>where
Self: Unpin,
fn read_u32<'a>(&'a mut self) -> ReadU32<&'a mut Self>where Self: Unpin,
source§fn read_i32<'a>(&'a mut self) -> ReadI32<&'a mut Self>where
Self: Unpin,
fn read_i32<'a>(&'a mut self) -> ReadI32<&'a mut Self>where Self: Unpin,
source§fn read_u64<'a>(&'a mut self) -> ReadU64<&'a mut Self>where
Self: Unpin,
fn read_u64<'a>(&'a mut self) -> ReadU64<&'a mut Self>where Self: Unpin,
source§fn read_i64<'a>(&'a mut self) -> ReadI64<&'a mut Self>where
Self: Unpin,
fn read_i64<'a>(&'a mut self) -> ReadI64<&'a mut Self>where Self: Unpin,
source§fn read_u128<'a>(&'a mut self) -> ReadU128<&'a mut Self>where
Self: Unpin,
fn read_u128<'a>(&'a mut self) -> ReadU128<&'a mut Self>where Self: Unpin,
source§fn read_i128<'a>(&'a mut self) -> ReadI128<&'a mut Self>where
Self: Unpin,
fn read_i128<'a>(&'a mut self) -> ReadI128<&'a mut Self>where Self: Unpin,
source§fn read_f32<'a>(&'a mut self) -> ReadF32<&'a mut Self>where
Self: Unpin,
fn read_f32<'a>(&'a mut self) -> ReadF32<&'a mut Self>where Self: Unpin,
source§fn read_f64<'a>(&'a mut self) -> ReadF64<&'a mut Self>where
Self: Unpin,
fn read_f64<'a>(&'a mut self) -> ReadF64<&'a mut Self>where Self: Unpin,
source§fn read_u16_le<'a>(&'a mut self) -> ReadU16Le<&'a mut Self>where
Self: Unpin,
fn read_u16_le<'a>(&'a mut self) -> ReadU16Le<&'a mut Self>where Self: Unpin,
source§fn read_i16_le<'a>(&'a mut self) -> ReadI16Le<&'a mut Self>where
Self: Unpin,
fn read_i16_le<'a>(&'a mut self) -> ReadI16Le<&'a mut Self>where Self: Unpin,
source§fn read_u32_le<'a>(&'a mut self) -> ReadU32Le<&'a mut Self>where
Self: Unpin,
fn read_u32_le<'a>(&'a mut self) -> ReadU32Le<&'a mut Self>where Self: Unpin,
source§fn read_i32_le<'a>(&'a mut self) -> ReadI32Le<&'a mut Self>where
Self: Unpin,
fn read_i32_le<'a>(&'a mut self) -> ReadI32Le<&'a mut Self>where Self: Unpin,
source§fn read_u64_le<'a>(&'a mut self) -> ReadU64Le<&'a mut Self>where
Self: Unpin,
fn read_u64_le<'a>(&'a mut self) -> ReadU64Le<&'a mut Self>where Self: Unpin,
source§fn read_i64_le<'a>(&'a mut self) -> ReadI64Le<&'a mut Self>where
Self: Unpin,
fn read_i64_le<'a>(&'a mut self) -> ReadI64Le<&'a mut Self>where Self: Unpin,
source§fn read_u128_le<'a>(&'a mut self) -> ReadU128Le<&'a mut Self>where
Self: Unpin,
fn read_u128_le<'a>(&'a mut self) -> ReadU128Le<&'a mut Self>where Self: Unpin,
source§fn read_i128_le<'a>(&'a mut self) -> ReadI128Le<&'a mut Self>where
Self: Unpin,
fn read_i128_le<'a>(&'a mut self) -> ReadI128Le<&'a mut Self>where Self: Unpin,
source§fn read_f32_le<'a>(&'a mut self) -> ReadF32Le<&'a mut Self>where
Self: Unpin,
fn read_f32_le<'a>(&'a mut self) -> ReadF32Le<&'a mut Self>where Self: Unpin,
source§fn read_f64_le<'a>(&'a mut self) -> ReadF64Le<&'a mut Self>where
Self: Unpin,
fn read_f64_le<'a>(&'a mut self) -> ReadF64Le<&'a mut Self>where Self: Unpin,
source§fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8, Global>
) -> ReadToEnd<'a, Self>where
Self: Unpin,
fn read_to_end<'a>( &'a mut self, buf: &'a mut Vec<u8, Global> ) -> ReadToEnd<'a, Self>where Self: Unpin,
buf
. Read more