Skip to content

Commit 1b9b41a

Browse files
authored
Add a PoolExt::connect_existing_tcp_listener function. (#310)
This is useful for use cases that don't want to deal with the fd wrapper type changing.
1 parent a6409ee commit 1b9b41a

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

cap-net-ext/src/lib.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,17 @@ pub trait PoolExt: private::Sealed {
246246
addrs: A,
247247
) -> io::Result<TcpStream>;
248248

249+
/// Initiate a TCP connection on a socket.
250+
///
251+
/// This is simlar to to [`connect_into_tcp_stream`], however instead
252+
/// of converting a `TcpListener` to a `TcpStream`, it leaves fd in the
253+
/// existing `TcpListener`.
254+
fn connect_existing_tcp_listener<A: ToSocketAddrs>(
255+
&self,
256+
socket: &TcpListener,
257+
addrs: A,
258+
) -> io::Result<()>;
259+
249260
/// Initiate a UDP connection.
250261
///
251262
/// This is simlar to to [`Pool::connect_udp_socket`] in that it performs a
@@ -310,14 +321,23 @@ impl PoolExt for Pool {
310321
socket: TcpListener,
311322
addrs: A,
312323
) -> io::Result<TcpStream> {
324+
self.connect_existing_tcp_listener(&socket, addrs)?;
325+
Ok(TcpStream::from(OwnedFd::from(socket)))
326+
}
327+
328+
fn connect_existing_tcp_listener<A: ToSocketAddrs>(
329+
&self,
330+
socket: &TcpListener,
331+
addrs: A,
332+
) -> io::Result<()> {
313333
let addrs = addrs.to_socket_addrs()?;
314334

315335
let mut last_err = None;
316336
for addr in addrs {
317337
self._pool().check_addr(&addr)?;
318338

319339
match rustix::net::connect(&socket, &addr) {
320-
Ok(()) => return Ok(TcpStream::from(OwnedFd::from(socket))),
340+
Ok(()) => return Ok(()),
321341
Err(err) => last_err = Some(err),
322342
}
323343
}

0 commit comments

Comments
 (0)