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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
extern crate neli;
use std::{error::Error, io::Cursor};
use neli::{
consts::{genl::*, nl::*},
genl::{AttrTypeBuilder, GenlmsghdrBuilder, NlattrBuilder},
nl::{NlPayload, NlmsghdrBuilder},
types::GenlBuffer,
Size, ToBytes,
};
pub fn main() -> Result<(), Box<dyn Error>> {
let attrs = vec![
NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(0).build()?)
.nla_payload(Vec::<u8>::new())
.build()?
.nest(
&NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(1).build()?)
.nla_payload("this is a string")
.build()?,
)?
.nest(
&NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(1).build()?)
.nla_payload(0)
.build()?,
)?,
NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(2).build()?)
.nla_payload(Vec::<u8>::new())
.build()?
.nest(
&NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(1).build()?)
.nla_payload("this is also a string")
.build()?,
)?
.nest(
&NlattrBuilder::default()
.nla_type(AttrTypeBuilder::default().nla_type(2).build()?)
.nla_payload(5)
.build()?,
)?,
]
.into_iter()
.collect::<GenlBuffer<_, _>>();
let genlmsg = GenlmsghdrBuilder::default()
.cmd(CtrlCmd::Getfamily)
.version(2)
.attrs(attrs)
.build()?;
let nlmsg = NlmsghdrBuilder::default()
.nl_type(Nlmsg::Noop)
.nl_flags(NlmF::REQUEST)
.nl_payload(NlPayload::Payload(genlmsg))
.build()?;
let mut buffer = Cursor::new(vec![0; nlmsg.padded_size()]);
nlmsg.to_bytes(&mut buffer)?;
println!(
"Serialized heterogeneous attributes: {:?}",
buffer.into_inner()
);
Ok(())
}
|