1use super::*;
2use crate::io::TokioCompat;
3
4use ::tokio::net;
5
6
7
8#[cfg(unix)]
9#[cfg_attr(docsrs, doc(cfg(unix)))]
10impl UnixSocketAddr for net::unix::SocketAddr {
11 fn is_unnamed(&self) -> bool {
12 self.is_unnamed()
13 }
14
15 fn as_pathname(&self) -> Option<&Path> {
16 self.as_pathname()
17 }
18}
19
20
21
22#[async_trait]
23impl TcpStream for net::TcpStream {
24 async fn connect<A: ToSocketAddrs + Send>(addrs: A) -> std::io::Result<Self> {
25 let addrs: Vec<SocketAddr> = ToSocketAddrs::to_socket_addrs(addrs).await.collect();
26
27 Self::connect(&addrs[..]).await
28 }
29
30 async fn peek(&self, buf: &mut [u8]) -> std::io::Result<usize> {
31 self.peek(buf).await
32 }
33
34 fn peer_addr(&self) -> std::io::Result<SocketAddr> {
35 self.peer_addr()
36 }
37
38 fn local_addr(&self) -> std::io::Result<SocketAddr> {
39 self.local_addr()
40 }
41
42 fn nodelay(&self) -> std::io::Result<bool> {
43 self.nodelay()
44 }
45
46 fn set_nodelay(&self, nodelay: bool) -> std::io::Result<()> {
47 self.set_nodelay(nodelay)
48 }
49
50 fn ttl(&self) -> std::io::Result<u32> {
51 self.ttl()
52 }
53
54 fn set_ttl(&self, ttl: u32) -> std::io::Result<()> {
55 self.set_ttl(ttl)
56 }
57}
58
59#[async_trait]
60impl TcpStream for TokioCompat<net::TcpStream> {
61 async fn connect<A: ToSocketAddrs + Send>(addrs: A) -> std::io::Result<Self> {
62 let addrs: Vec<SocketAddr> = ToSocketAddrs::to_socket_addrs(addrs).await.collect();
63
64 let inner = net::TcpStream::connect(&addrs[..]).await?;
65
66 Ok(Self::new(inner))
67 }
68
69 async fn peek(&self, buf: &mut [u8]) -> std::io::Result<usize> {
70 self.get_ref().peek(buf).await
71 }
72
73 fn peer_addr(&self) -> std::io::Result<SocketAddr> {
74 self.get_ref().peer_addr()
75 }
76
77 fn local_addr(&self) -> std::io::Result<SocketAddr> {
78 self.get_ref().local_addr()
79 }
80
81 fn nodelay(&self) -> std::io::Result<bool> {
82 self.get_ref().nodelay()
83 }
84
85 fn set_nodelay(&self, nodelay: bool) -> std::io::Result<()> {
86 self.get_ref().set_nodelay(nodelay)
87 }
88
89 fn ttl(&self) -> std::io::Result<u32> {
90 self.get_ref().ttl()
91 }
92
93 fn set_ttl(&self, ttl: u32) -> std::io::Result<()> {
94 self.get_ref().set_ttl(ttl)
95 }
96}
97
98
99
100#[async_trait]
101impl TcpListener for net::TcpListener {
102 type TcpStream = net::TcpStream;
103
104 async fn bind<A: ToSocketAddrs + Send>(addrs: A) -> std::io::Result<Self> {
105 let addrs: Vec<SocketAddr> = ToSocketAddrs::to_socket_addrs(addrs).await.collect();
106
107 Self::bind(&addrs[..]).await
108 }
109
110 async fn accept(&self) -> std::io::Result<(Self::TcpStream, SocketAddr)> {
111 self.accept().await
112 }
113
114 fn local_addr(&self) -> std::io::Result<SocketAddr> {
115 self.local_addr()
116 }
117}
118
119
120
121#[cfg(unix)]
122#[cfg_attr(docsrs, doc(cfg(unix)))]
123#[async_trait]
124impl UnixStream for net::UnixStream {
125 type SocketAddr = net::unix::SocketAddr;
126
127 async fn connect<P: AsRef<Path> + Send>(path: P) -> std::io::Result<Self> {
128 Self::connect(path).await
129 }
130
131 fn pair() -> std::io::Result<(Self, Self)> {
132 Self::pair()
133 }
134
135 fn peer_addr(&self) -> std::io::Result<Self::SocketAddr> {
136 self.peer_addr()
137 }
138
139 fn local_addr(&self) -> std::io::Result<Self::SocketAddr> {
140 self.local_addr()
141 }
142}
143
144#[cfg(unix)]
145#[cfg_attr(docsrs, doc(cfg(unix)))]
146#[async_trait]
147impl UnixStream for TokioCompat<net::UnixStream> {
148 type SocketAddr = net::unix::SocketAddr;
149
150 async fn connect<P: AsRef<Path> + Send>(path: P) -> std::io::Result<Self> {
151 let inner = net::UnixStream::connect(path).await?;
152
153 Ok(Self::new(inner))
154 }
155
156 fn pair() -> std::io::Result<(Self, Self)> {
157 net::UnixStream::pair().map(|(inner1, inner2)| (Self::new(inner1), Self::new(inner2)))
158 }
159
160 fn peer_addr(&self) -> std::io::Result<Self::SocketAddr> {
161 self.get_ref().peer_addr()
162 }
163
164 fn local_addr(&self) -> std::io::Result<Self::SocketAddr> {
165 self.get_ref().local_addr()
166 }
167}
168
169
170
171#[cfg(unix)]
172#[cfg_attr(docsrs, doc(cfg(unix)))]
173#[async_trait]
174impl UnixListener for net::UnixListener {
175 type UnixStream = net::UnixStream;
176 type SocketAddr = net::unix::SocketAddr;
177
178 async fn bind<P: AsRef<Path> + Send>(path: P) -> std::io::Result<Self> {
179 Self::bind(path)
180 }
181
182 async fn accept(&self) -> std::io::Result<(Self::UnixStream, Self::SocketAddr)> {
183 self.accept().await
184 }
185
186 fn local_addr(&self) -> std::io::Result<Self::SocketAddr> {
187 self.local_addr()
188 }
189}