Struct cpio::newc::Reader

source ·
pub struct Reader<R: Read> { /* private fields */ }
Expand description

Reads one entry header/data from an archive.

Implementations§

source§

impl<R: Read> Reader<R>

source

pub fn new(inner: R) -> Result<Reader<R>>

Parses metadata for the next entry in an archive, and returns a reader that will yield the entry data.

Examples found in repository?
examples/listcpio.rs (line 9)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }
        println!(
            "{} ({} bytes)",
            reader.entry().name(),
            reader.entry().file_size()
        );
        file = reader.finish().unwrap();
    }
}
More examples
Hide additional examples
examples/extractcpio.rs (line 11)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let filename = std::env::args().nth(2).unwrap();
    let output = std::env::args().nth(3).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }

        if filename == reader.entry().name() {
            println!(
                "{} ({} bytes)",
                reader.entry().name(),
                reader.entry().file_size()
            );

            let out = std::fs::File::create(&output).unwrap();
            file = reader.to_writer(out).unwrap();
        } else {
            file = reader.skip().unwrap();
        }
    }
}
source

pub fn entry(&self) -> &Entry

Returns the metadata for this entry.

Examples found in repository?
examples/listcpio.rs (line 10)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }
        println!(
            "{} ({} bytes)",
            reader.entry().name(),
            reader.entry().file_size()
        );
        file = reader.finish().unwrap();
    }
}
More examples
Hide additional examples
examples/extractcpio.rs (line 12)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let filename = std::env::args().nth(2).unwrap();
    let output = std::env::args().nth(3).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }

        if filename == reader.entry().name() {
            println!(
                "{} ({} bytes)",
                reader.entry().name(),
                reader.entry().file_size()
            );

            let out = std::fs::File::create(&output).unwrap();
            file = reader.to_writer(out).unwrap();
        } else {
            file = reader.skip().unwrap();
        }
    }
}
source

pub fn finish(self) -> Result<R>

Finishes reading this entry and returns the underlying reader in a position ready to read the next entry (if any).

Examples found in repository?
examples/listcpio.rs (line 18)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }
        println!(
            "{} ({} bytes)",
            reader.entry().name(),
            reader.entry().file_size()
        );
        file = reader.finish().unwrap();
    }
}
source

pub fn to_writer<W: Write>(self, writer: W) -> Result<R>

Write the contents of the entry out to the writer using io::copy, taking advantage of any platform-specific behavior to effeciently copy data that io::copy can use. If any of the file data has already been read through the Read interface, this will copy the remaining data in the entry.

Examples found in repository?
examples/extractcpio.rs (line 24)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let filename = std::env::args().nth(2).unwrap();
    let output = std::env::args().nth(3).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }

        if filename == reader.entry().name() {
            println!(
                "{} ({} bytes)",
                reader.entry().name(),
                reader.entry().file_size()
            );

            let out = std::fs::File::create(&output).unwrap();
            file = reader.to_writer(out).unwrap();
        } else {
            file = reader.skip().unwrap();
        }
    }
}
source§

impl<R: Read + Seek> Reader<R>

source

pub fn offset(&mut self) -> Result<u64>

Returns the offset within inner, which can be useful for efficient io::copy()/copy_file_range() of file data.

source

pub fn skip(self) -> Result<R>

Skip past all remaining file data in this entry, returning the underlying reader in a position ready to read the next entry (if any).

Examples found in repository?
examples/extractcpio.rs (line 26)
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
fn main() {
    let path = std::env::args().nth(1).unwrap();
    let filename = std::env::args().nth(2).unwrap();
    let output = std::env::args().nth(3).unwrap();
    let mut file = std::fs::File::open(path).unwrap();
    loop {
        let reader = cpio::NewcReader::new(file).unwrap();
        if reader.entry().is_trailer() {
            break;
        }

        if filename == reader.entry().name() {
            println!(
                "{} ({} bytes)",
                reader.entry().name(),
                reader.entry().file_size()
            );

            let out = std::fs::File::create(&output).unwrap();
            file = reader.to_writer(out).unwrap();
        } else {
            file = reader.skip().unwrap();
        }
    }
}

Trait Implementations§

source§

impl<R: Read> Read for Reader<R>

source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
1.36.0 · source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Read all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Read all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Read the exact number of bytes required to fill buf. Read more
source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Read the exact number of bytes required to fill cursor. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more

Auto Trait Implementations§

§

impl<R> Freeze for Reader<R>
where R: Freeze,

§

impl<R> RefUnwindSafe for Reader<R>
where R: RefUnwindSafe,

§

impl<R> Send for Reader<R>
where R: Send,

§

impl<R> Sync for Reader<R>
where R: Sync,

§

impl<R> Unpin for Reader<R>
where R: Unpin,

§

impl<R> UnwindSafe for Reader<R>
where R: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.