@@ -8,8 +8,14 @@ use crate::net::unix::SocketAddr;
8
8
use std:: fmt;
9
9
use std:: io:: { self , Read , Write } ;
10
10
use 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 ;
11
17
use 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 } ;
13
19
use std:: path:: Path ;
14
20
use std:: pin:: Pin ;
15
21
use std:: task:: { Context , Poll } ;
@@ -66,7 +72,20 @@ impl UnixStream {
66
72
where
67
73
P : AsRef < Path > ,
68
74
{
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) ?;
70
89
let stream = UnixStream :: new ( stream) ?;
71
90
72
91
poll_fn ( |cx| stream. io . registration ( ) . poll_write_ready ( cx) ) . await ?;
0 commit comments