@@ -26,6 +26,7 @@ mod libc {
26
26
}
27
27
28
28
use ascii;
29
+ use convert:: { TryFrom , TryInto } ;
29
30
use ffi:: OsStr ;
30
31
use fmt;
31
32
use io:: { self , Initializer } ;
@@ -87,6 +88,15 @@ unsafe fn sockaddr_un(path: &Path) -> io::Result<(libc::sockaddr_un, libc::sockl
87
88
Ok ( ( addr, len as libc:: socklen_t ) )
88
89
}
89
90
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
+
90
100
enum AddressKind < ' a > {
91
101
Unnamed ,
92
102
Pathname ( & ' a Path ) ,
@@ -299,17 +309,15 @@ impl UnixStream {
299
309
/// };
300
310
/// ```
301
311
#[ 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 > {
304
314
unsafe {
305
315
let inner = Socket :: new_raw ( libc:: AF_UNIX , libc:: SOCK_STREAM ) ?;
306
- let ( addr, len) = sockaddr_un ( path) ?;
307
-
308
316
cvt ( libc:: connect ( * inner. as_inner ( ) , & addr as * const _ as * const _ , len) ) ?;
309
317
Ok ( UnixStream ( inner) )
310
318
}
311
319
}
312
- inner ( path . as_ref ( ) )
320
+ inner ( socket . try_into ( ) ? )
313
321
}
314
322
315
323
/// Creates an unnamed pair of connected sockets.
0 commit comments