xenet_sys/
lib.rs

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