1 2 3 4 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 30 31 32 33 34 35 36 37 38 39 40 41
use super::{RecordData, RecordType}; use ::error::Error; use ::libresolv_sys::__ns_rr as Rr; use ::libresolv_sys::__ns_msg as Message; use ::libresolv_sys::MAXDNAME; use std::ffi::CStr; #[derive(Debug, Clone)] pub struct NS { pub dname: String, } impl RecordData for NS { fn get_record_type() -> RecordType { RecordType::NS } fn extract(msg: &mut Message, rr: &Rr) -> Result<NS, Error> { if rr.type_ != Self::get_record_type() as u16 { return Err(Error::WrongRRType); } let mut buffer: [u8; MAXDNAME as usize] = [0; MAXDNAME as usize]; let size = unsafe { ::libresolv_sys::ns_name_uncompress( msg._msg, msg._eom, rr.rdata, buffer.as_mut_ptr() as *mut i8, MAXDNAME as usize) }; if size < 0 { return Err(Error::UncompressError); } Ok(NS { dname: unsafe { CStr::from_ptr(buffer.as_ptr() as *const i8) .to_string_lossy().into_owned() }, }) } }