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}