@@ -100,24 +100,23 @@ fn make_addr(_domain: Domain, sockaddr: &str) -> Result<UnixAddr> {
100
100
UnixAddr :: new ( sockaddr) . map_err ( err_to_others_err ! ( e, "" ) )
101
101
}
102
102
103
- fn make_socket ( addr : ( & str , u32 ) ) -> Result < ( RawFd , Domain , SockAddr ) > {
103
+ fn make_socket ( addr : ( & str , u32 ) ) -> Result < ( RawFd , Domain , Box < dyn SockaddrLike > ) > {
104
104
let ( sockaddr, _) = addr;
105
105
let ( domain, sockaddrv) = parse_sockaddr ( sockaddr) ?;
106
106
107
- let get_sock_addr = |domain, sockaddr| -> Result < ( RawFd , SockAddr ) > {
107
+ let get_sock_addr = |domain, sockaddr| -> Result < ( RawFd , Box < dyn SockaddrLike > ) > {
108
108
let fd = socket ( AddressFamily :: Unix , SockType :: Stream , SOCK_CLOEXEC , None )
109
109
. map_err ( |e| Error :: Socket ( e. to_string ( ) ) ) ?;
110
110
111
111
// MacOS doesn't support atomic creation of a socket descriptor with SOCK_CLOEXEC flag,
112
112
// so there is a chance of leak if fork + exec happens in between of these calls.
113
113
#[ cfg( target_os = "macos" ) ]
114
114
set_fd_close_exec ( fd) ?;
115
-
116
- let sockaddr = SockAddr :: Unix ( make_addr ( domain, sockaddr) ?) ;
117
- Ok ( ( fd, sockaddr) )
115
+ let sockaddr = make_addr ( domain, sockaddr) ?;
116
+ Ok ( ( fd, Box :: new ( sockaddr) ) )
118
117
} ;
119
118
120
- let ( fd, sockaddr) = match domain {
119
+ let ( fd, sockaddr) : ( i32 , Box < dyn SockaddrLike > ) = match domain {
121
120
Domain :: Unix => get_sock_addr ( domain, sockaddrv) ?,
122
121
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
123
122
Domain :: Vsock => {
@@ -138,8 +137,8 @@ fn make_socket(addr: (&str, u32)) -> Result<(RawFd, Domain, SockAddr)> {
138
137
)
139
138
. map_err ( |e| Error :: Socket ( e. to_string ( ) ) ) ?;
140
139
let cid = addr. 1 ;
141
- let sockaddr = SockAddr :: new_vsock ( cid, port) ;
142
- ( fd, sockaddr)
140
+ let sockaddr = VsockAddr :: new ( cid, port) ;
141
+ ( fd, Box :: new ( sockaddr) )
143
142
}
144
143
} ;
145
144
@@ -160,7 +159,7 @@ pub(crate) fn do_bind(sockaddr: &str) -> Result<(RawFd, Domain)> {
160
159
let ( fd, domain, sockaddr) = make_socket ( ( sockaddr, VMADDR_CID_ANY ) ) ?;
161
160
162
161
setsockopt ( fd, sockopt:: ReusePort , & true ) ?;
163
- bind ( fd, & sockaddr) . map_err ( err_to_others_err ! ( e, "" ) ) ?;
162
+ bind ( fd, sockaddr. as_ref ( ) ) . map_err ( err_to_others_err ! ( e, "" ) ) ?;
164
163
165
164
Ok ( ( fd, domain) )
166
165
}
@@ -169,7 +168,7 @@ pub(crate) fn do_bind(sockaddr: &str) -> Result<(RawFd, Domain)> {
169
168
pub ( crate ) unsafe fn client_connect ( sockaddr : & str ) -> Result < RawFd > {
170
169
let ( fd, _, sockaddr) = make_socket ( ( sockaddr, VMADDR_CID_HOST ) ) ?;
171
170
172
- connect ( fd, & sockaddr) ?;
171
+ connect ( fd, sockaddr. as_ref ( ) ) ?;
173
172
174
173
Ok ( fd)
175
174
}
0 commit comments