pub mod ip;
use core::mem::size_of;
pub use linux_unsafe::sock_type;
use crate::fd::ioctl::{ioctl_read, IoctlReqRead, _IOR};
pub unsafe trait SockAddr {
unsafe fn sockaddr_raw_const(&self)
-> (*const linux_unsafe::sockaddr, linux_unsafe::socklen_t);
unsafe fn sockaddr_raw_mut(&mut self)
-> (*mut linux_unsafe::sockaddr, linux_unsafe::socklen_t);
}
pub trait SocketProtocol {
type Device: crate::fd::ioctl::IoDevice;
fn raw_protocol_num(&self) -> linux_unsafe::int;
}
#[inline(always)]
pub const unsafe fn socket_protocol<Device: crate::fd::ioctl::IoDevice>(
num: linux_unsafe::int,
) -> SocketProtocolFixed<Device> {
SocketProtocolFixed::numbered(num)
}
#[repr(transparent)]
pub struct SocketProtocolFixed<Device: crate::fd::ioctl::IoDevice> {
num: linux_unsafe::int,
_phantom: core::marker::PhantomData<Device>,
}
impl<Device: crate::fd::ioctl::IoDevice> SocketProtocolFixed<Device> {
#[inline(always)]
pub(crate) const unsafe fn numbered(num: linux_unsafe::int) -> Self {
Self {
num,
_phantom: core::marker::PhantomData,
}
}
}
impl<Device: crate::fd::ioctl::IoDevice> SocketProtocol for SocketProtocolFixed<Device> {
type Device = Device;
#[inline(always)]
fn raw_protocol_num(&self) -> linux_unsafe::int {
self.num
}
}
pub struct SocketDevice;
impl crate::fd::ioctl::IoDevice for SocketDevice {}
const SOCK_IOC_TYPE: linux_unsafe::ulong = 0x89;
pub const SIOCGSTAMP: IoctlReqRead<SocketDevice, linux_unsafe::timeval> = unsafe {
ioctl_read(_IOR(
SOCK_IOC_TYPE,
0x06,
(size_of::<core::ffi::c_longlong>() * 2) as linux_unsafe::ulong,
))
};