Skip to content

Commit

Permalink
mnl: rename parse_payload() to parse_attrs()
Browse files Browse the repository at this point in the history
And add cl_parse_attrs.
  • Loading branch information
chamaken committed Jun 2, 2017
1 parent 360dac7 commit 217afd1
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1466,11 +1466,16 @@ extern fn attr_parse_cb2(attr: *const netlink::Nlattr, data: *mut c_void) -> c_i
/// # Return values
/// This function propagates the return value of the callback, which can be
/// MNL_CB_ERROR, MNL_CB_OK or MNL_CB_STOP.
pub fn parse_payload<'a, T: 'a + ?Sized>(payload: &[u8], payload_len: usize, cb: AttrCb<'a, T>, data: &mut T) -> io::Result<(CbRet)> {
pub fn parse_attrs<'a, T: 'a + ?Sized>(payload: &[u8], cb: AttrCb<'a, T>, data: &mut T) -> io::Result<(CbRet)> {
let mut cbdata = AttrCbData{ cb: cb, data: data };
let pdata = &mut cbdata as *mut _ as *mut c_void;
cvt_cbret!(mnl_attr_parse_payload(payload.as_ptr() as *const c_void,
payload_len as size_t, attr_parse_cb::<T>, pdata))
payload.len() as size_t, attr_parse_cb::<T>, pdata))
}

pub fn cl_parse_attrs<'a>(payload: &[u8], cb: Box<FnMut(&'a Attr) -> CbRet>) -> io::Result<(CbRet)> {
cvt_cbret!(mnl_attr_parse_payload(payload.as_ptr() as *const c_void, payload.len() as size_t,
attr_parse_cb2, Box::into_raw(Box::new(cb)) as *mut c_void))
}

extern fn nlmsg_parse_cb<T: ?Sized>(nlh: *const netlink::Nlmsghdr, data: *mut c_void) -> c_int {
Expand Down
46 changes: 46 additions & 0 deletions tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1188,3 +1188,49 @@ fn nlmsg_put_sized_header_check() {
assert!(nlh.put_sized_header::<linux::netlink::Nlmsghdr>().is_err());
}
}

fn attr_cb1(attr: &mnl::Attr, data: &mut u16) -> mnl::CbRet {
if attr.nla_type < *data {
return mnl::CbRet::OK;
}
mnl::CbRet::ERROR
}

#[test]
fn attr_parse_attrs() {
let mut buf = [0u8; 512];
let mut nlh = mnl::Nlmsg::new(&mut buf).unwrap();
for i in 0..4 {
nlh.put_u8(i as u16, i).unwrap();
}

assert!(mnl::parse_attrs(nlh.payload_bytes(), attr_cb1, &mut 4u16).unwrap() == mnl::CbRet::OK);
assert!(mnl::parse_attrs(nlh.payload_bytes(), attr_cb1, &mut 3u16).is_err());
}

#[test]
fn attr_cl_parse_payload() {
let mut buf = [0u8; 512];
let mut nlh = mnl::Nlmsg::new(&mut buf).unwrap();
for i in 0..4 {
nlh.put_u8(i as u16, i).unwrap();
}

let mut data = 4;
assert!(mnl::cl_parse_attrs(nlh.payload_bytes(),
Box::new(move |attr| {
if attr.nla_type < data {
return mnl::CbRet::OK;
}
mnl::CbRet::ERROR
})).unwrap() == mnl::CbRet::OK);

data = 3;
assert!(mnl::cl_parse_attrs(nlh.payload_bytes(),
Box::new(move |attr| {
if attr.nla_type < data {
return mnl::CbRet::OK;
}
mnl::CbRet::ERROR
})).is_err());
}

0 comments on commit 217afd1

Please sign in to comment.