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())?,
}
}
}