use std::os::raw::c_int;
use anyhow::Result;
use nell::{Family, Socket};
use nell::ffi::*;
use nell::sys::socket::{Name, Level};
#[test]
#[cfg_attr(miri, ignore)]
fn add_drop_membership() -> Result<()> {
let sock = Socket::new(Family::ROUTE)?;
sock.add_membership(RTNLGRP_LINK)?;
sock.add_membership(RTNLGRP_IPV4_IFADDR)?;
sock.add_membership(RTNLGRP_IPV6_IFADDR)?;
let groups = sock.list_memberships()?;
assert!(groups[0] & RTMGRP_LINK == RTMGRP_LINK);
assert!(groups[0] & RTMGRP_IPV4_IFADDR == RTMGRP_IPV4_IFADDR);
assert!(groups[0] & RTMGRP_IPV6_IFADDR == RTMGRP_IPV6_IFADDR);
sock.drop_membership(RTNLGRP_LINK)?;
sock.drop_membership(RTNLGRP_IPV4_IFADDR)?;
sock.drop_membership(RTNLGRP_IPV6_IFADDR)?;
let groups = sock.list_memberships()?;
assert_eq!(0, groups[0]);
Ok(())
}
#[test]
#[cfg_attr(miri, ignore)]
fn get_set_sockopt() -> Result<()> {
const NETLINK: Level = Level::NETLINK;
const CAP_ACK: Name = Name::NETLINK_CAP_ACK;
let sock = Socket::new(Family::ROUTE)?;
let on: c_int = 1;
let off: c_int = 0;
assert_eq!(off, sock.get_sockopt(NETLINK, CAP_ACK)?);
sock.set_sockopt(NETLINK, CAP_ACK, &on)?;
assert_eq!(on, sock.get_sockopt(NETLINK, CAP_ACK)?);
Ok(())
}