Skip to content

Commit adb5b01

Browse files
authored
Merge pull request #129 from Tim-Zhang/refactor-socket-protocol
Refactor the code related to socket address parser
2 parents 58cf93e + c1b5498 commit adb5b01

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

src/common.rs

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ use std::os::unix::io::RawFd;
1818
pub(crate) enum Domain {
1919
Unix,
2020
#[cfg(target_os = "linux")]
21-
AbstractUnix,
22-
#[cfg(target_os = "linux")]
2321
Vsock,
2422
}
2523

@@ -43,38 +41,31 @@ pub(crate) fn do_listen(listener: RawFd) -> Result<()> {
4341
listen(listener, 10).map_err(|e| Error::Socket(e.to_string()))
4442
}
4543

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));
5048
}
5149

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));
5552
}
5653

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('@') {
6161
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+
));
6464
}
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));
7566
}
7667

77-
Ok((domain, addr))
68+
Err(Error::Others(format!("Scheme {:?} is not supported", addr)))
7869
}
7970

8071
#[cfg(any(feature = "async", not(target_os = "linux")))]
@@ -97,9 +88,12 @@ pub(crate) const SOCK_CLOEXEC: SockFlag = SockFlag::empty();
9788
#[cfg(target_os = "linux")]
9889
fn make_addr(domain: Domain, sockaddr: &str) -> Result<UnixAddr> {
9990
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+
}
10397
}
10498
Domain::Vsock => Err(Error::Others(
10599
"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)> {
132126
let (fd, sockaddr) = match domain {
133127
Domain::Unix => get_sock_addr(domain, sockaddrv)?,
134128
#[cfg(target_os = "linux")]
135-
Domain::AbstractUnix => get_sock_addr(domain, sockaddrv)?,
136-
#[cfg(target_os = "linux")]
137129
Domain::Vsock => {
138130
let sockaddr_port_v: Vec<&str> = sockaddrv.split(':').collect();
139131
if sockaddr_port_v.len() != 2 {
@@ -231,11 +223,11 @@ mod tests {
231223
true,
232224
),
233225
("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),
235227
(
236228
"unix://@/run/b.sock",
237-
Some(Domain::AbstractUnix),
238-
"/run/b.sock",
229+
Some(Domain::Unix),
230+
"@/run/b.sock",
239231
true,
240232
),
241233
("abc:///run/c.sock", None, "", false),

0 commit comments

Comments
 (0)