123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- use log::*;
- use crate::strings::{Labels, ReadLabels};
- use crate::wire::*;
- #[derive(PartialEq, Debug, Clone)]
- pub struct SOA {
-
- pub mname: Labels,
-
- pub rname: Labels,
-
- pub serial: u32,
-
-
- pub refresh_interval: u32,
-
-
-
- pub retry_interval: u32,
-
-
-
- pub expire_limit: u32,
-
- pub minimum_ttl: u32,
- }
- impl Wire for SOA {
- const NAME: &'static str = "SOA";
- const RR_TYPE: u16 = 6;
- #[cfg_attr(all(test, feature = "with_mutagen"), ::mutagen::mutate)]
- fn read(len: u16, c: &mut Cursor<&[u8]>) -> Result<Self, WireError> {
- let (mname, mname_len) = c.read_labels()?;
- trace!("Parsed mname -> {:?}", mname);
- let (rname, rname_len) = c.read_labels()?;
- trace!("Parsed rname -> {:?}", rname);
- let serial = c.read_u32::<BigEndian>()?;
- trace!("Parsed serial -> {:?}", serial);
- let refresh_interval = c.read_u32::<BigEndian>()?;
- trace!("Parsed refresh interval -> {:?}", refresh_interval);
- let retry_interval = c.read_u32::<BigEndian>()?;
- trace!("Parsed retry interval -> {:?}", retry_interval);
- let expire_limit = c.read_u32::<BigEndian>()?;
- trace!("Parsed expire limit -> {:?}", expire_limit);
- let minimum_ttl = c.read_u32::<BigEndian>()?;
- trace!("Parsed minimum TTL -> {:?}", minimum_ttl);
- let got_len = 4 * 5 + mname_len + rname_len;
- if len == got_len {
- trace!("Length is correct");
- Ok(Self {
- mname, rname, serial, refresh_interval,
- retry_interval, expire_limit, minimum_ttl,
- })
- }
- else {
- warn!("Length is incorrect (record length {:?}, mname plus rname plus fields length {:?})", len, got_len);
- Err(WireError::WrongLabelLength { expected: len, got: got_len })
- }
- }
- }
- #[cfg(test)]
- mod test {
- use super::*;
- #[test]
- fn parses() {
- let buf = &[
- 0x05, 0x62, 0x73, 0x61, 0x67, 0x6f, 0x02, 0x6d, 0x65,
- 0x00,
- 0x05, 0x62, 0x73, 0x61, 0x67, 0x6f, 0x02, 0x6d, 0x65,
- 0x00,
- 0x5d, 0x3c, 0xef, 0x02,
- 0x00, 0x01, 0x51, 0x80,
- 0x00, 0x00, 0x1c, 0x20,
- 0x00, 0x09, 0x3a, 0x80,
- 0x00, 0x00, 0x01, 0x2c,
- ];
- assert_eq!(SOA::read(buf.len() as _, &mut Cursor::new(buf)).unwrap(),
- SOA {
- mname: Labels::encode("bsago.me").unwrap(),
- rname: Labels::encode("bsago.me").unwrap(),
- serial: 1564274434,
- refresh_interval: 86400,
- retry_interval: 7200,
- expire_limit: 604800,
- minimum_ttl: 300,
- });
- }
- #[test]
- fn record_empty() {
- assert_eq!(SOA::read(0, &mut Cursor::new(&[])),
- Err(WireError::IO));
- }
- #[test]
- fn buffer_ends_abruptly() {
- let buf = &[
- 0x05, 0x62,
- ];
- assert_eq!(SOA::read(23, &mut Cursor::new(buf)),
- Err(WireError::IO));
- }
- }
|