Skip to content

Commit c2908aa

Browse files
authored
Remove unix_socket dependency (#117)
Since 1.70.0, the `SocketAddrExt` trait provides ways to create a socket address for Unix sockets with abstract names: <https://doc.rust-lang.org/std/os/linux/net/trait.SocketAddrExt.html>
2 parents b089419 + 5e6ce3f commit c2908aa

File tree

3 files changed

+20
-40
lines changed

3 files changed

+20
-40
lines changed

varlink/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ winapi = { version = "0.3", features = ["winuser", "winsock2"] }
3838

3939
[target.'cfg(unix)'.dependencies]
4040
libc = { version = "0.2.126", default-features = false }
41-
unix_socket = "0.5"
4241

4342
[dev-dependencies]
4443
static_assertions = "1.1.0"

varlink/src/client.rs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::net::TcpStream;
66
#[cfg(unix)]
77
use std::os::unix::io::{AsRawFd, IntoRawFd};
88
#[cfg(unix)]
9-
use std::os::unix::net::UnixStream;
9+
use std::os::unix::net::{UnixListener, UnixStream};
1010
use std::process::Child;
1111

1212
#[cfg(unix)]
@@ -28,13 +28,11 @@ pub fn varlink_connect<S: ?Sized + AsRef<str>>(address: &S) -> Result<(Box<dyn S
2828
Box::new(TcpStream::connect(addr).map_err(map_context!())?),
2929
new_address,
3030
))
31+
} else if let Some(addr) = new_address.strip_prefix("unix:@") {
32+
let addr = addr.split(';').next().unwrap_or(addr);
33+
get_abstract_unixstream(addr).map(|v| (Box::new(v) as Box<dyn Stream>, new_address))
3134
} else if let Some(addr) = new_address.strip_prefix("unix:") {
32-
let mut addr = String::from(addr.split(';').next().unwrap());
33-
if addr.starts_with('@') {
34-
addr = addr.replacen('@', "\0", 1);
35-
return get_abstract_unixstream(&addr)
36-
.map(|v| (Box::new(v) as Box<dyn Stream>, new_address));
37-
}
35+
let addr = addr.split(';').next().unwrap_or(addr);
3836
Ok((
3937
Box::new(UnixStream::connect(addr).map_err(map_context!())?),
4038
new_address,
@@ -46,18 +44,11 @@ pub fn varlink_connect<S: ?Sized + AsRef<str>>(address: &S) -> Result<(Box<dyn S
4644

4745
#[cfg(any(target_os = "linux", target_os = "android"))]
4846
fn get_abstract_unixstream(addr: &str) -> Result<UnixStream> {
49-
// FIXME: abstract unix domains sockets still not in std
50-
// FIXME: https://github.com/rust-lang/rust/issues/14194
51-
use std::os::unix::io::FromRawFd;
52-
use unix_socket::UnixStream as AbstractStream;
47+
use std::os::linux::net::SocketAddrExt;
48+
use std::os::unix::net::SocketAddr;
5349

54-
unsafe {
55-
Ok(UnixStream::from_raw_fd(
56-
AbstractStream::connect(addr)
57-
.map_err(map_context!())?
58-
.into_raw_fd(),
59-
))
60-
}
50+
let addr = SocketAddr::from_abstract_name(addr).map_err(map_context!())?;
51+
UnixStream::connect_addr(&addr).map_err(map_context!())
6152
}
6253

6354
#[cfg(not(any(target_os = "linux", target_os = "android")))]
@@ -85,8 +76,6 @@ pub fn varlink_exec<S: ?Sized + AsRef<str>>(
8576

8677
let executable = String::from("exec ") + address.as_ref();
8778

88-
use unix_socket::UnixListener;
89-
9079
let dir = tempdir().map_err(map_context!())?;
9180
let file_path = dir.path().join("varlink-socket");
9281

@@ -153,7 +142,6 @@ pub fn varlink_bridge<S: ?Sized + AsRef<str>>(address: &S) -> Result<(Child, Box
153142
use std::process::Command;
154143

155144
let executable = address.as_ref();
156-
// use unix_socket::UnixStream;
157145
let (stream0, stream1) = UnixStream::pair().map_err(map_context!())?;
158146
let fd = stream1.into_raw_fd();
159147
let childin = unsafe { ::std::fs::File::from_raw_fd(fd) };

varlink/src/server.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,11 @@ fn activation_listener() -> Option<usize> {
6464

6565
#[cfg(any(target_os = "linux", target_os = "android"))]
6666
fn get_abstract_unixlistener(addr: &str) -> Result<UnixListener> {
67-
// FIXME: abstract unix domains sockets still not in std
68-
// FIXME: https://github.com/rust-lang/rust/issues/14194
69-
use unix_socket::UnixListener as AbstractUnixListener;
70-
71-
unsafe {
72-
Ok(UnixListener::from_raw_fd(
73-
AbstractUnixListener::bind(addr)
74-
.map_err(map_context!())?
75-
.into_raw_fd(),
76-
))
77-
}
67+
use std::os::linux::net::SocketAddrExt;
68+
use std::os::unix::net::SocketAddr;
69+
70+
let addr = SocketAddr::from_abstract_name(addr).map_err(map_context!())?;
71+
UnixListener::bind_addr(&addr).map_err(map_context!())
7872
}
7973

8074
#[cfg(not(any(target_os = "linux", target_os = "android")))]
@@ -134,14 +128,13 @@ impl Listener {
134128
Some(TcpListener::bind(addr).map_err(map_context!())?),
135129
false,
136130
))
131+
} else if let Some(addr) = address.strip_prefix("unix:@") {
132+
get_abstract_unixlistener(addr.split(';').next().unwrap_or(addr))
133+
.map(|v| Listener::UNIX(Some(v), false))
137134
} else if let Some(addr) = address.strip_prefix("unix:") {
138-
let mut addr = String::from(addr.split(';').next().unwrap());
139-
if addr.starts_with('@') {
140-
addr = addr.replacen('@', "\0", 1);
141-
return get_abstract_unixlistener(&addr).map(|v| Listener::UNIX(Some(v), false));
142-
}
143-
// ignore error on non-existant file
144-
let _ = fs::remove_file(&*addr);
135+
let addr = addr.split(';').next().unwrap_or(addr);
136+
// ignore error on non-existent file
137+
_ = fs::remove_file(addr);
145138
Ok(Listener::UNIX(
146139
Some(UnixListener::bind(addr).map_err(map_context!())?),
147140
false,

0 commit comments

Comments
 (0)