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::*;
use nell::ffi::*;
use nell::sync::Socket;
use Family::Route;

fn main() -> Result<()> {
    let mut sock = Socket::new(Route)?;
    let groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
    sock.bind(getpid(), groups)?;

    let mut msg = Message::<()>::new(NLMSG_DONE);
    msg.set_flags(NLM_F_ACK);
    sock.send(&msg)?;
    assert!(sock.recv::<()>()? == Netlink::Ack);

    while let Netlink::Msg(msg) = sock.recv::<Any>()? {
        match (msg.nlmsg_type(), msg.any()) {
            (RTM_NEWLINK,  Any::IFInfo(msg)) => println!("+ {:?}", link(msg)?),
            (RTM_DELLINK,  Any::IFInfo(msg)) => println!("- {:?}", link(msg)?),
            (RTM_NEWADDR,  Any::IFAddr(msg)) => println!("+ {:?}", addr(msg)?),
            (RTM_DELADDR,  Any::IFAddr(msg)) => println!("- {:?}", addr(msg)?),
            (RTM_NEWNEIGH, Any::Peer(msg))   => println!("+ {:?}", peer(msg)?),
            (RTM_DELNEIGH, Any::Peer(msg))   => println!("- {:?}", peer(msg)?),
            (RTM_NEWROUTE, Any::Route(msg))  => println!("+ {:?}", route(msg)?),
            (RTM_DELROUTE, Any::Route(msg))  => println!("- {:?}", route(msg)?),
            other                            => println!("unexpected: {:?}", other),
        }
    }

    Ok(())
}