soio/sys/
udp.rs

1use {io, Ready, Poll, PollOpt, Token};
2use evented::Evented;
3use sys::eventedfd::EventedFd;
4use std::net::{self, Ipv4Addr, Ipv6Addr, SocketAddr};
5use std::os::unix::io::{RawFd, IntoRawFd, AsRawFd, FromRawFd};
6
7#[derive(Debug)]
8pub struct UdpSocket {
9    io: net::UdpSocket,
10}
11
12impl UdpSocket {
13    pub fn new(socket: net::UdpSocket) -> io::Result<UdpSocket> {
14        socket.set_nonblocking(true)?;
15        Ok(UdpSocket {
16            io: socket,
17        })
18    }
19
20    pub fn local_addr(&self) -> io::Result<SocketAddr> {
21        self.io.local_addr()
22    }
23
24    pub fn try_clone(&self) -> io::Result<UdpSocket> {
25        self.io.try_clone().map(|io| {
26            UdpSocket {
27                io: io,
28            }
29        })
30    }
31
32    pub fn send_to(&self, buf: &[u8], target: &SocketAddr) -> io::Result<usize> {
33        self.io.send_to(buf, target)
34    }
35
36    pub fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
37        self.io.recv_from(buf)
38    }
39
40    pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
41        self.io.send(buf)
42    }
43
44    pub fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
45        self.io.recv(buf)
46    }
47
48    pub fn connect(&self, addr: SocketAddr) -> io::Result<()> {
49        self.io.connect(addr)
50    }
51
52    pub fn broadcast(&self) -> io::Result<bool> {
53        self.io.broadcast()
54    }
55
56    pub fn set_broadcast(&self, on: bool) -> io::Result<()> {
57        self.io.set_broadcast(on)
58    }
59
60    pub fn multicast_loop_v4(&self) -> io::Result<bool> {
61        self.io.multicast_loop_v4()
62    }
63
64    pub fn set_multicast_loop_v4(&self, on: bool) -> io::Result<()> {
65        self.io.set_multicast_loop_v4(on)
66    }
67
68    pub fn multicast_ttl_v4(&self) -> io::Result<u32> {
69        self.io.multicast_ttl_v4()
70    }
71
72    pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> {
73        self.io.set_multicast_ttl_v4(ttl)
74    }
75
76    pub fn multicast_loop_v6(&self) -> io::Result<bool> {
77        self.io.multicast_loop_v6()
78    }
79
80    pub fn set_multicast_loop_v6(&self, on: bool) -> io::Result<()> {
81        self.io.set_multicast_loop_v6(on)
82    }
83
84    pub fn ttl(&self) -> io::Result<u32> {
85        self.io.ttl()
86    }
87
88    pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
89        self.io.set_ttl(ttl)
90    }
91
92    pub fn join_multicast_v4(&self,
93                             multiaddr: &Ipv4Addr,
94                             interface: &Ipv4Addr) -> io::Result<()> {
95        self.io.join_multicast_v4(multiaddr, interface)
96    }
97
98    pub fn join_multicast_v6(&self,
99                             multiaddr: &Ipv6Addr,
100                             interface: u32) -> io::Result<()> {
101        self.io.join_multicast_v6(multiaddr, interface)
102    }
103
104    pub fn leave_multicast_v4(&self,
105                              multiaddr: &Ipv4Addr,
106                              interface: &Ipv4Addr) -> io::Result<()> {
107        self.io.leave_multicast_v4(multiaddr, interface)
108    }
109
110    pub fn leave_multicast_v6(&self,
111                              multiaddr: &Ipv6Addr,
112                              interface: u32) -> io::Result<()> {
113        self.io.leave_multicast_v6(multiaddr, interface)
114    }
115
116    pub fn take_error(&self) -> io::Result<Option<io::Error>> {
117        self.io.take_error()
118    }
119}
120
121impl Evented for UdpSocket {
122    fn register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()> {
123        EventedFd(&self.as_raw_fd()).register(poll, token, interest, opts)
124    }
125
126    fn reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()> {
127        EventedFd(&self.as_raw_fd()).reregister(poll, token, interest, opts)
128    }
129
130    fn deregister(&self, poll: &Poll) -> io::Result<()> {
131        EventedFd(&self.as_raw_fd()).deregister(poll)
132    }
133}
134
135impl FromRawFd for UdpSocket {
136    unsafe fn from_raw_fd(fd: RawFd) -> UdpSocket {
137        UdpSocket {
138            io: net::UdpSocket::from_raw_fd(fd),
139        }
140    }
141}
142
143impl IntoRawFd for UdpSocket {
144    fn into_raw_fd(self) -> RawFd {
145        self.io.into_raw_fd()
146    }
147}
148
149impl AsRawFd for UdpSocket {
150    fn as_raw_fd(&self) -> RawFd {
151        self.io.as_raw_fd()
152    }
153}