Skip to content

Commit

Permalink
Adopt new nix API's for SockaddrLike
Browse files Browse the repository at this point in the history
Adopt new nix API's for SockaddrLike

Signed-off-by: James Sturtevant <jstur@microsoft.com>
  • Loading branch information
jsturtevant committed May 25, 2023
1 parent e8bcf3c commit fee3e00
Showing 1 changed file with 9 additions and 10 deletions.
19 changes: 9 additions & 10 deletions src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,24 +100,23 @@ fn make_addr(_domain: Domain, sockaddr: &str) -> Result<UnixAddr> {
UnixAddr::new(sockaddr).map_err(err_to_others_err!(e, ""))
}

fn make_socket(addr: (&str, u32)) -> Result<(RawFd, Domain, SockAddr)> {
fn make_socket(addr: (&str, u32)) -> Result<(RawFd, Domain, Box<dyn SockaddrLike>)> {
let (sockaddr, _) = addr;
let (domain, sockaddrv) = parse_sockaddr(sockaddr)?;

let get_sock_addr = |domain, sockaddr| -> Result<(RawFd, SockAddr)> {
let get_sock_addr = |domain, sockaddr| -> Result<(RawFd, Box<dyn SockaddrLike>)> {
let fd = socket(AddressFamily::Unix, SockType::Stream, SOCK_CLOEXEC, None)
.map_err(|e| Error::Socket(e.to_string()))?;

// MacOS doesn't support atomic creation of a socket descriptor with SOCK_CLOEXEC flag,
// so there is a chance of leak if fork + exec happens in between of these calls.
#[cfg(target_os = "macos")]
set_fd_close_exec(fd)?;

let sockaddr = SockAddr::Unix(make_addr(domain, sockaddr)?);
Ok((fd, sockaddr))
let sockaddr = make_addr(domain, sockaddr)?;
Ok((fd, Box::new(sockaddr)))
};

let (fd, sockaddr) = match domain {
let (fd, sockaddr): (i32, Box<dyn SockaddrLike>) = match domain {
Domain::Unix => get_sock_addr(domain, sockaddrv)?,
#[cfg(any(target_os = "linux", target_os = "android"))]
Domain::Vsock => {
Expand All @@ -138,8 +137,8 @@ fn make_socket(addr: (&str, u32)) -> Result<(RawFd, Domain, SockAddr)> {
)
.map_err(|e| Error::Socket(e.to_string()))?;
let cid = addr.1;
let sockaddr = SockAddr::new_vsock(cid, port);
(fd, sockaddr)
let sockaddr = VsockAddr::new(cid, port);
(fd, Box::new(sockaddr))
}
};

Expand All @@ -160,7 +159,7 @@ pub(crate) fn do_bind(sockaddr: &str) -> Result<(RawFd, Domain)> {
let (fd, domain, sockaddr) = make_socket((sockaddr, VMADDR_CID_ANY))?;

setsockopt(fd, sockopt::ReusePort, &true)?;
bind(fd, &sockaddr).map_err(err_to_others_err!(e, ""))?;
bind(fd, sockaddr.as_ref()).map_err(err_to_others_err!(e, ""))?;

Ok((fd, domain))
}
Expand All @@ -169,7 +168,7 @@ pub(crate) fn do_bind(sockaddr: &str) -> Result<(RawFd, Domain)> {
pub(crate) unsafe fn client_connect(sockaddr: &str) -> Result<RawFd> {
let (fd, _, sockaddr) = make_socket((sockaddr, VMADDR_CID_HOST))?;

connect(fd, &sockaddr)?;
connect(fd, sockaddr.as_ref())?;

Ok(fd)
}
Expand Down

0 comments on commit fee3e00

Please sign in to comment.