diff options
author | tomberek <tomberek@users.noreply.github.com> | 2022-01-28 10:18:29 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-28 10:18:29 -0500 |
commit | 2bf96bd9f299885b38cafa460a06c77f0c296dfe (patch) | |
tree | ea5509fce38534d28d13984d1171385a9dc9a122 /nix-rust/src/nar.rs | |
parent | 73e82ae954be991858053df2a6b7323fe3a82c36 (diff) | |
parent | 4bf6af7b555033de5c1d6851edb60a91940d43c3 (diff) |
Merge branch 'master' into bundler_drv
Diffstat (limited to 'nix-rust/src/nar.rs')
-rw-r--r-- | nix-rust/src/nar.rs | 126 |
1 files changed, 0 insertions, 126 deletions
diff --git a/nix-rust/src/nar.rs b/nix-rust/src/nar.rs deleted file mode 100644 index cb520935e..000000000 --- a/nix-rust/src/nar.rs +++ /dev/null @@ -1,126 +0,0 @@ -use crate::Error; -use byteorder::{LittleEndian, ReadBytesExt}; -use std::convert::TryFrom; -use std::io::Read; - -pub fn parse<R: Read>(input: &mut R) -> Result<(), Error> { - if String::read(input)? != NAR_VERSION_MAGIC { - return Err(Error::BadNarVersionMagic); - } - - parse_file(input) -} - -const NAR_VERSION_MAGIC: &str = "nix-archive-1"; - -fn parse_file<R: Read>(input: &mut R) -> Result<(), Error> { - if String::read(input)? != "(" { - return Err(Error::MissingNarOpenTag); - } - - if String::read(input)? != "type" { - return Err(Error::MissingNarField); - } - - match String::read(input)?.as_ref() { - "regular" => { - let mut _executable = false; - let mut tag = String::read(input)?; - if tag == "executable" { - _executable = true; - if String::read(input)? != "" { - return Err(Error::BadExecutableField); - } - tag = String::read(input)?; - } - if tag != "contents" { - return Err(Error::MissingNarField); - } - let _contents = Vec::<u8>::read(input)?; - if String::read(input)? != ")" { - return Err(Error::MissingNarCloseTag); - } - } - "directory" => loop { - match String::read(input)?.as_ref() { - "entry" => { - if String::read(input)? != "(" { - return Err(Error::MissingNarOpenTag); - } - if String::read(input)? != "name" { - return Err(Error::MissingNarField); - } - let _name = String::read(input)?; - if String::read(input)? != "node" { - return Err(Error::MissingNarField); - } - parse_file(input)?; - let tag = String::read(input)?; - if tag != ")" { - return Err(Error::MissingNarCloseTag); - } - } - ")" => break, - s => return Err(Error::BadNarField(s.into())), - } - }, - "symlink" => { - if String::read(input)? != "target" { - return Err(Error::MissingNarField); - } - let _target = String::read(input)?; - if String::read(input)? != ")" { - return Err(Error::MissingNarCloseTag); - } - } - s => return Err(Error::BadNarField(s.into())), - } - - Ok(()) -} - -trait Deserialize: Sized { - fn read<R: Read>(input: &mut R) -> Result<Self, Error>; -} - -impl Deserialize for String { - fn read<R: Read>(input: &mut R) -> Result<Self, Error> { - let buf = Deserialize::read(input)?; - Ok(String::from_utf8(buf).map_err(|_| Error::BadNarString)?) - } -} - -impl Deserialize for Vec<u8> { - fn read<R: Read>(input: &mut R) -> Result<Self, Error> { - let n: usize = Deserialize::read(input)?; - let mut buf = vec![0; n]; - input.read_exact(&mut buf)?; - skip_padding(input, n)?; - Ok(buf) - } -} - -fn skip_padding<R: Read>(input: &mut R, len: usize) -> Result<(), Error> { - if len % 8 != 0 { - let mut buf = [0; 8]; - let buf = &mut buf[0..8 - (len % 8)]; - input.read_exact(buf)?; - if !buf.iter().all(|b| *b == 0) { - return Err(Error::BadNarPadding); - } - } - Ok(()) -} - -impl Deserialize for u64 { - fn read<R: Read>(input: &mut R) -> Result<Self, Error> { - Ok(input.read_u64::<LittleEndian>()?) - } -} - -impl Deserialize for usize { - fn read<R: Read>(input: &mut R) -> Result<Self, Error> { - let n: u64 = Deserialize::read(input)?; - Ok(usize::try_from(n).map_err(|_| Error::NarSizeFieldTooBig)?) - } -} |