uapi 0.2.13

Wrappers for OS APIs on UNIX-like platform
Documentation
use crate::*;
use std::{convert::TryInto, mem};

#[man(getsockopt(2))]
pub fn getsockopt<T: Pod + ?Sized>(
    sockfd: c::c_int,
    level: c::c_int,
    optname: c::c_int,
    t: &mut T,
) -> Result<usize> {
    let mut len = match mem::size_of_val(t).try_into() {
        Ok(l) => l,
        Err(_) => return einval(),
    };
    let res =
        unsafe { c::getsockopt(sockfd, level, optname, t as *mut _ as *mut _, &mut len) };
    black_box(t);
    map_err!(res).map(|_| len as usize)
}

#[man(setsockopt(2))]
pub fn setsockopt<T: ?Sized>(
    sockfd: c::c_int,
    level: c::c_int,
    optname: c::c_int,
    t: &T,
) -> Result<()> {
    let len = match mem::size_of_val(t).try_into() {
        Ok(l) => l,
        Err(_) => return einval(),
    };
    let t: *const c::c_void = black_box_id(t as *const _ as *const _);
    let res = unsafe { c::setsockopt(sockfd, level, optname, t, len) };
    map_err!(res).map(drop)
}