nell 0.3.0

Linux netlink interface
Documentation
// Copyright (C) 2020 - Will Glozer. All rights reserved.

use std::mem::{size_of, zeroed};
use std::os::unix::prelude::*;
use errno::errno;
use libc::{AF_NETLINK, sockaddr, sockaddr_nl, sa_family_t};
use crate::Error;

pub fn bind<T: AsRawFd>(sock: &T, pid: u32, groups: u32) -> Result<(), Error> {
    unsafe {
        let mut addr: sockaddr_nl = zeroed();
        addr.nl_family = AF_NETLINK as sa_family_t;
        addr.nl_pid    = pid;
        addr.nl_groups = groups;

        let ptr = &addr as *const _ as *const sockaddr;
        let len = size_of::<sockaddr_nl>() as u32;

        match libc::bind(sock.as_raw_fd(), ptr, len) {
            0 => Ok(()),
            _ => Err(errno())?,
        }
    }
}