nex_sys/
lib.rs

1//! Cross-platform system helpers and low-level wrappers used internally by the nex crates.
2
3#[cfg(not(target_os = "windows"))]
4mod unix;
5#[cfg(not(target_os = "windows"))]
6pub use self::unix::*;
7
8#[cfg(target_os = "windows")]
9mod windows;
10#[cfg(target_os = "windows")]
11pub use self::windows::*;
12
13/// Any file descriptor on unix, only sockets on Windows.
14pub struct FileDesc {
15    pub fd: CSocket,
16}
17
18impl Drop for FileDesc {
19    fn drop(&mut self) {
20        unsafe {
21            close(self.fd);
22        }
23    }
24}
25
26pub fn send_to(
27    socket: CSocket,
28    buffer: &[u8],
29    dst: *const SockAddr,
30    slen: SockLen,
31) -> std::io::Result<usize> {
32    let send_len = retry(&mut || unsafe {
33        sendto(
34            socket,
35            buffer.as_ptr() as Buf,
36            buffer.len() as BufLen,
37            0,
38            dst,
39            slen,
40        )
41    });
42
43    if send_len < 0 {
44        Err(std::io::Error::last_os_error())
45    } else {
46        Ok(send_len as usize)
47    }
48}
49
50pub fn recv_from(
51    socket: CSocket,
52    buffer: &mut [u8],
53    caddr: *mut SockAddrStorage,
54) -> std::io::Result<usize> {
55    let mut caddrlen = std::mem::size_of::<SockAddrStorage>() as SockLen;
56    let len = retry(&mut || unsafe {
57        recvfrom(
58            socket,
59            buffer.as_ptr() as MutBuf,
60            buffer.len() as BufLen,
61            0,
62            caddr as *mut SockAddr,
63            &mut caddrlen,
64        )
65    });
66
67    if len < 0 {
68        Err(std::io::Error::last_os_error())
69    } else {
70        Ok(len as usize)
71    }
72}