@@ -18,8 +18,6 @@ use std::os::unix::io::RawFd;
18
18
pub ( crate ) enum Domain {
19
19
Unix ,
20
20
#[ cfg( target_os = "linux" ) ]
21
- AbstractUnix ,
22
- #[ cfg( target_os = "linux" ) ]
23
21
Vsock ,
24
22
}
25
23
@@ -43,38 +41,31 @@ pub(crate) fn do_listen(listener: RawFd) -> Result<()> {
43
41
listen ( listener, 10 ) . map_err ( |e| Error :: Socket ( e. to_string ( ) ) )
44
42
}
45
43
46
- pub ( crate ) fn parse_sockaddr ( sockaddr : & str ) -> Result < ( Domain , & str ) > {
47
- let sockaddrv : Vec < & str > = sockaddr . trim ( ) . split ( "://" ) . collect ( ) ;
48
- if sockaddrv . len ( ) != 2 {
49
- return Err ( Error :: Others ( format ! ( "sockaddr {} is not right" , sockaddr ) ) ) ;
44
+ # [ cfg ( target_os = "linux" ) ]
45
+ fn parse_sockaddr ( addr : & str ) -> Result < ( Domain , & str ) > {
46
+ if let Some ( addr ) = addr . strip_prefix ( "unix://" ) {
47
+ return Ok ( ( Domain :: Unix , addr ) ) ;
50
48
}
51
49
52
- let addr = sockaddrv[ 1 ] ;
53
- if addr. is_empty ( ) {
54
- return Err ( Error :: Others ( format ! ( "address {} is empty" , addr) ) ) ;
50
+ if let Some ( addr) = addr. strip_prefix ( "vsock://" ) {
51
+ return Ok ( ( Domain :: Vsock , addr) ) ;
55
52
}
56
53
57
- let domain = match & sockaddrv[ 0 ] . to_lowercase ( ) [ ..] {
58
- "unix" if !addr. starts_with ( '@' ) => Domain :: Unix ,
59
- #[ cfg( not( target_os = "linux" ) ) ]
60
- "unix" if addr. starts_with ( '@' ) => {
54
+ Err ( Error :: Others ( format ! ( "Scheme {:?} is not supported" , addr) ) )
55
+ }
56
+
57
+ #[ cfg( not( target_os = "linux" ) ) ]
58
+ fn parse_sockaddr ( addr : & str ) -> Result < ( Domain , & str ) > {
59
+ if let Some ( addr) = addr. strip_prefix ( "unix://" ) {
60
+ if addr. starts_with ( '@' ) {
61
61
return Err ( Error :: Others (
62
- "Abstract socket is not supported " . to_string ( ) ,
63
- ) )
62
+ "Abstract unix domain socket is not support on this platform " . to_string ( ) ,
63
+ ) ) ;
64
64
}
65
- #[ cfg( target_os = "linux" ) ]
66
- "unix" if addr. starts_with ( '@' ) => Domain :: AbstractUnix ,
67
- #[ cfg( target_os = "linux" ) ]
68
- "vsock" => Domain :: Vsock ,
69
- x => return Err ( Error :: Others ( format ! ( "Scheme {:?} is not supported" , x) ) ) ,
70
- } ;
71
-
72
- #[ cfg( target_os = "linux" ) ]
73
- if domain == Domain :: AbstractUnix {
74
- return Ok ( ( domain, & addr[ 1 ..] ) ) ;
65
+ return Ok ( ( Domain :: Unix , addr) ) ;
75
66
}
76
67
77
- Ok ( ( domain , addr) )
68
+ Err ( Error :: Others ( format ! ( "Scheme {:?} is not supported" , addr) ) )
78
69
}
79
70
80
71
#[ cfg( any( feature = "async" , not( target_os = "linux" ) ) ) ]
@@ -97,9 +88,12 @@ pub(crate) const SOCK_CLOEXEC: SockFlag = SockFlag::empty();
97
88
#[ cfg( target_os = "linux" ) ]
98
89
fn make_addr ( domain : Domain , sockaddr : & str ) -> Result < UnixAddr > {
99
90
match domain {
100
- Domain :: Unix => UnixAddr :: new ( sockaddr) . map_err ( err_to_others_err ! ( e, "" ) ) ,
101
- Domain :: AbstractUnix => {
102
- UnixAddr :: new_abstract ( sockaddr. as_bytes ( ) ) . map_err ( err_to_others_err ! ( e, "" ) )
91
+ Domain :: Unix => {
92
+ if let Some ( sockaddr) = sockaddr. strip_prefix ( '@' ) {
93
+ UnixAddr :: new_abstract ( sockaddr. as_bytes ( ) ) . map_err ( err_to_others_err ! ( e, "" ) )
94
+ } else {
95
+ UnixAddr :: new ( sockaddr) . map_err ( err_to_others_err ! ( e, "" ) )
96
+ }
103
97
}
104
98
Domain :: Vsock => Err ( Error :: Others (
105
99
"function make_addr does not support create vsock socket" . to_string ( ) ,
@@ -132,8 +126,6 @@ fn make_socket(addr: (&str, u32)) -> Result<(RawFd, Domain, SockAddr)> {
132
126
let ( fd, sockaddr) = match domain {
133
127
Domain :: Unix => get_sock_addr ( domain, sockaddrv) ?,
134
128
#[ cfg( target_os = "linux" ) ]
135
- Domain :: AbstractUnix => get_sock_addr ( domain, sockaddrv) ?,
136
- #[ cfg( target_os = "linux" ) ]
137
129
Domain :: Vsock => {
138
130
let sockaddr_port_v: Vec < & str > = sockaddrv. split ( ':' ) . collect ( ) ;
139
131
if sockaddr_port_v. len ( ) != 2 {
@@ -231,11 +223,11 @@ mod tests {
231
223
true ,
232
224
) ,
233
225
( "vsock://8:1024" , Some ( Domain :: Vsock ) , "8:1024" , true ) ,
234
- ( "Vsock://8:1025" , Some ( Domain :: Vsock ) , "8:1025" , true ) ,
226
+ ( "Vsock://8:1025" , Some ( Domain :: Vsock ) , "8:1025" , false ) ,
235
227
(
236
228
"unix://@/run/b.sock" ,
237
- Some ( Domain :: AbstractUnix ) ,
238
- "/run/b.sock" ,
229
+ Some ( Domain :: Unix ) ,
230
+ "@ /run/b.sock" ,
239
231
true ,
240
232
) ,
241
233
( "abc:///run/c.sock" , None , "" , false ) ,
0 commit comments