@@ -8,8 +8,14 @@ use crate::net::unix::SocketAddr;
88use std:: fmt;
99use std:: io:: { self , Read , Write } ;
1010use std:: net:: Shutdown ;
11+ #[ cfg( target_os = "android" ) ]
12+ use std:: os:: android:: net:: SocketAddrExt ;
13+ #[ cfg( target_os = "linux" ) ]
14+ use std:: os:: linux:: net:: SocketAddrExt ;
15+ #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
16+ use std:: os:: unix:: ffi:: OsStrExt ;
1117use std:: os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , FromRawFd , IntoRawFd , RawFd } ;
12- use std:: os:: unix:: net;
18+ use std:: os:: unix:: net:: { self , SocketAddr as StdSocketAddr } ;
1319use std:: path:: Path ;
1420use std:: pin:: Pin ;
1521use std:: task:: { Context , Poll } ;
@@ -66,7 +72,20 @@ impl UnixStream {
6672 where
6773 P : AsRef < Path > ,
6874 {
69- let stream = mio:: net:: UnixStream :: connect ( path) ?;
75+ // On linux, abstract socket paths need to be considered.
76+ #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
77+ let addr = {
78+ let os_str_bytes = path. as_ref ( ) . as_os_str ( ) . as_bytes ( ) ;
79+ if os_str_bytes. starts_with ( b"\0 " ) {
80+ StdSocketAddr :: from_abstract_name ( os_str_bytes) ?
81+ } else {
82+ StdSocketAddr :: from_pathname ( path) ?
83+ }
84+ } ;
85+ #[ cfg( not( any( target_os = "linux" , target_os = "android" ) ) ) ]
86+ let addr = StdSocketAddr :: from_pathname ( path) ?;
87+
88+ let stream = mio:: net:: UnixStream :: connect_addr ( & addr) ?;
7089 let stream = UnixStream :: new ( stream) ?;
7190
7291 poll_fn ( |cx| stream. io . registration ( ) . poll_write_ready ( cx) ) . await ?;
0 commit comments