nell 0.2.0

Linux netlink API access
Documentation
// Copyright (C) 2019 - Will Glozer. All rights reserved.

use anyhow::Result;
use nell::{Family, Message, Netlink};
use nell::api::{addr, link, peer, route};
use nell::ffi::*;
use nell::sync::Socket;
use {Family::Route, Netlink::Msg};

fn main() -> Result<()> {
    let mut sock = Socket::new(Route)?;

    let mut msg = Message::<rtgenmsg>::new(RTM_GETLINK);
    msg.set_flags(NLM_F_REQUEST | NLM_F_DUMP);
    msg.rtgen_family = AF_UNSPEC;
    sock.send(&msg)?;

    while let Msg(msg) = sock.recv::<ifinfomsg>()? {
        let link = link(msg)?;
        println!("{:?}", link);
    }

    let mut msg = Message::<rtgenmsg>::new(RTM_GETADDR);
    msg.set_flags(NLM_F_REQUEST | NLM_F_DUMP);
    msg.rtgen_family = AF_UNSPEC;
    sock.send(&msg)?;

    while let Msg(msg) = sock.recv::<ifaddrmsg>()? {
        let addr = addr(msg)?;
        println!("{:?}", addr);
    }

    let mut msg = Message::<rtgenmsg>::new(RTM_GETROUTE);
    msg.set_flags(NLM_F_REQUEST | NLM_F_DUMP);
    msg.rtgen_family = AF_UNSPEC;
    sock.send(&msg)?;

    while let Msg(msg) = sock.recv::<rtmsg>()? {
        let route = route(msg)?;
        println!("{:?}", route);
    }

    let mut msg = Message::<rtgenmsg>::new(RTM_GETNEIGH);
    msg.set_flags(NLM_F_REQUEST | NLM_F_DUMP);
    msg.rtgen_family = AF_UNSPEC;
    sock.send(&msg)?;

    while let Msg(msg) = sock.recv::<ndmsg>()? {
        let peer = peer(msg)?;
        println!("{:?}", peer);
    }

    Ok(())
}