Skip to content

Commit d47e979

Browse files
author
Jethro Beekman
committed
Allow passing a unix::net::SocketAddr to UnixStream::connect
1 parent 7dd078f commit d47e979

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/libstd/sys/unix/ext/net.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ mod libc {
2626
}
2727

2828
use ascii;
29+
use convert::{TryFrom, TryInto};
2930
use ffi::OsStr;
3031
use fmt;
3132
use io::{self, Initializer};
@@ -87,6 +88,15 @@ unsafe fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::sockl
8788
Ok((addr, len as libc::socklen_t))
8889
}
8990

91+
impl<P: AsRef<Path>> TryFrom<P> for SocketAddr {
92+
type Error = io::Error;
93+
94+
fn try_from(path: P) -> io::Result<SocketAddr> {
95+
let (addr, len) = sockaddr_un(path.as_ref())?;
96+
SocketAddr::from_parts(addr, len)
97+
}
98+
}
99+
90100
enum AddressKind<'a> {
91101
Unnamed,
92102
Pathname(&'a Path),
@@ -299,17 +309,15 @@ impl UnixStream {
299309
/// };
300310
/// ```
301311
#[stable(feature = "unix_socket", since = "1.10.0")]
302-
pub fn connect<P: AsRef<Path>>(path: P) -> io::Result<UnixStream> {
303-
fn inner(path: &Path) -> io::Result<UnixStream> {
312+
pub fn connect<S: TryInto<SocketAddr, Error=io::Error>>(socket: S) -> io::Result<UnixStream> {
313+
fn inner(SocketAddr { addr, len }: SocketAddr) -> io::Result<UnixStream> {
304314
unsafe {
305315
let inner = Socket::new_raw(libc::AF_UNIX, libc::SOCK_STREAM)?;
306-
let (addr, len) = sockaddr_un(path)?;
307-
308316
cvt(libc::connect(*inner.as_inner(), &addr as *const _ as *const _, len))?;
309317
Ok(UnixStream(inner))
310318
}
311319
}
312-
inner(path.as_ref())
320+
inner(socket.try_into()?)
313321
}
314322

315323
/// Creates an unnamed pair of connected sockets.

0 commit comments

Comments
 (0)