fix: macOS launch activate socket set nonblocking (#1451)

This commit is contained in:
zonyitoo
2024-03-13 22:35:14 +08:00
parent dd056c8294
commit dcdeca032c
7 changed files with 19 additions and 11 deletions
@@ -216,7 +216,7 @@ impl DnsTcpServerBuilder {
use tokio::net::TcpListener as TokioTcpListener;
use crate::net::launch_activate_socket::get_launch_activate_tcp_listener;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name)?;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name, true)?;
let tokio_listener = TokioTcpListener::from_std(std_listener)?;
TcpListener::from_listener(tokio_listener, self.context.accept_opts())?
} else {
@@ -389,7 +389,7 @@ impl DnsUdpServerBuilder {
use tokio::net::UdpSocket as TokioUdpSocket;
use crate::net::launch_activate_socket::get_launch_activate_udp_socket;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name)?;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name, true)?;
TokioUdpSocket::from_std(std_socket)?
} else {
create_standard_udp_listener(&self.context, &self.bind_addr).await?.into()
@@ -64,7 +64,7 @@ impl HttpBuilder {
use tokio::net::TcpListener as TokioTcpListener;
use crate::net::launch_activate_socket::get_launch_activate_tcp_listener;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name)?;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name, true)?;
let tokio_listener = TokioTcpListener::from_std(std_listener)?;
TcpListener::from_listener(tokio_listener, self.context.accept_opts())?
} else {
@@ -62,7 +62,7 @@ impl SocksTcpServerBuilder {
use tokio::net::TcpListener as TokioTcpListener;
use crate::net::launch_activate_socket::get_launch_activate_tcp_listener;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name)?;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name, true)?;
let tokio_listener = TokioTcpListener::from_std(std_listener)?;
ShadowTcpListener::from_listener(tokio_listener, self.context.accept_opts())?
} else {
@@ -71,7 +71,7 @@ impl Socks5UdpServerBuilder {
use tokio::net::UdpSocket as TokioUdpSocket;
use crate::net::launch_activate_socket::get_launch_activate_udp_socket;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name)?;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name, true)?;
TokioUdpSocket::from_std(std_socket)?
} else {
create_standard_udp_listener(&self.context, &self.client_config).await?.into()
@@ -52,7 +52,7 @@ impl TunnelTcpServerBuilder {
use tokio::net::TcpListener as TokioTcpListener;
use crate::net::launch_activate_socket::get_launch_activate_tcp_listener;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name)?;
let std_listener = get_launch_activate_tcp_listener(&launchd_socket_name, true)?;
let tokio_listener = TokioTcpListener::from_std(std_listener)?;
ShadowTcpListener::from_listener(tokio_listener, self.context.accept_opts())?
} else {
@@ -61,7 +61,7 @@ impl TunnelUdpServerBuilder {
use tokio::net::UdpSocket as TokioUdpSocket;
use crate::net::launch_activate_socket::get_launch_activate_udp_socket;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name)?;
let std_socket = get_launch_activate_udp_socket(&launchd_socket_name, true)?;
TokioUdpSocket::from_std(std_socket)?
} else {
create_standard_udp_listener(&self.context, &self.client_config).await?.into()
@@ -14,15 +14,23 @@ use log::debug;
use crate::sys::get_launch_activate_socket;
/// Get a macOS launch active socket as a `TcpListener`
pub fn get_launch_activate_tcp_listener(name: &str) -> io::Result<TcpListener> {
pub fn get_launch_activate_tcp_listener(name: &str, nonblock: bool) -> io::Result<TcpListener> {
let fd = get_launch_activate_socket(name)?;
debug!("created TCP listener from launch activate socket {}", fd);
Ok(unsafe { TcpListener::from_raw_fd(fd) })
let listener = unsafe { TcpListener::from_raw_fd(fd) };
if nonblock {
listener.set_nonblocking(true)?;
}
Ok(listener)
}
/// Get a macOS launch activate socket as a `UdpSocket`
pub fn get_launch_activate_udp_socket(name: &str) -> io::Result<UdpSocket> {
pub fn get_launch_activate_udp_socket(name: &str, nonblock: bool) -> io::Result<UdpSocket> {
let fd = get_launch_activate_socket(name)?;
debug!("created UDP socket from launch activate socket {}", fd);
Ok(unsafe { UdpSocket::from_raw_fd(fd) })
let socket = unsafe { UdpSocket::from_raw_fd(fd) };
if nonblock {
socket.set_nonblocking(true)?;
}
Ok(socket)
}