mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-21 08:16:32 +00:00
Fix results of getting UNIX names
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
98c17a3d1b
commit
5445a26ec5
@ -48,9 +48,17 @@ impl From<UnixSocketAddrBound> for UnixSocketAddr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<UnixSocketAddrBound> for SocketAddr {
|
impl From<Option<UnixSocketAddrBound>> for UnixSocketAddr {
|
||||||
fn from(value: UnixSocketAddrBound) -> Self {
|
fn from(value: Option<UnixSocketAddrBound>) -> Self {
|
||||||
let unix_socket_addr = UnixSocketAddr::from(value);
|
match value {
|
||||||
SocketAddr::Unix(unix_socket_addr)
|
Some(addr) => addr.into(),
|
||||||
|
None => Self::Unnamed,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Into<UnixSocketAddr>> From<T> for SocketAddr {
|
||||||
|
fn from(value: T) -> Self {
|
||||||
|
SocketAddr::Unix(value.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,7 @@ use super::{connected::Connected, endpoint::Endpoint, UnixStreamSocket};
|
|||||||
use crate::{
|
use crate::{
|
||||||
events::{IoEvents, Observer},
|
events::{IoEvents, Observer},
|
||||||
fs::{file_handle::FileLike, path::Dentry, utils::Inode},
|
fs::{file_handle::FileLike, path::Dentry, utils::Inode},
|
||||||
net::socket::{
|
net::socket::{unix::addr::UnixSocketAddrBound, SocketAddr},
|
||||||
unix::addr::{UnixSocketAddr, UnixSocketAddrBound},
|
|
||||||
SocketAddr,
|
|
||||||
},
|
|
||||||
prelude::*,
|
prelude::*,
|
||||||
process::signal::{Pollee, Poller},
|
process::signal::{Pollee, Poller},
|
||||||
};
|
};
|
||||||
@ -36,10 +33,7 @@ impl Listener {
|
|||||||
Connected::new(local_endpoint)
|
Connected::new(local_endpoint)
|
||||||
};
|
};
|
||||||
|
|
||||||
let peer_addr = match connected.peer_addr() {
|
let peer_addr = connected.peer_addr().cloned().into();
|
||||||
None => SocketAddr::Unix(UnixSocketAddr::Path(String::new())),
|
|
||||||
Some(addr) => SocketAddr::from(addr.clone()),
|
|
||||||
};
|
|
||||||
|
|
||||||
let socket = UnixStreamSocket::new_connected(connected, false);
|
let socket = UnixStreamSocket::new_connected(connected, false);
|
||||||
|
|
||||||
|
@ -278,11 +278,7 @@ impl Socket for UnixStreamSocket {
|
|||||||
State::Connected(connected) => connected.addr().cloned(),
|
State::Connected(connected) => connected.addr().cloned(),
|
||||||
};
|
};
|
||||||
|
|
||||||
addr.map(Into::<SocketAddr>::into)
|
Ok(addr.into())
|
||||||
.ok_or(Error::with_message(
|
|
||||||
Errno::EINVAL,
|
|
||||||
"the socket does not bind to addr",
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn peer_addr(&self) -> Result<SocketAddr> {
|
fn peer_addr(&self) -> Result<SocketAddr> {
|
||||||
@ -291,10 +287,7 @@ impl Socket for UnixStreamSocket {
|
|||||||
_ => return_errno_with_message!(Errno::ENOTCONN, "the socket is not connected"),
|
_ => return_errno_with_message!(Errno::ENOTCONN, "the socket is not connected"),
|
||||||
};
|
};
|
||||||
|
|
||||||
match peer_addr {
|
Ok(peer_addr.into())
|
||||||
None => Ok(SocketAddr::Unix(UnixSocketAddr::Path(String::new()))),
|
|
||||||
Some(peer_addr) => Ok(SocketAddr::from(peer_addr)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sendmsg(
|
fn sendmsg(
|
||||||
|
@ -76,3 +76,121 @@ FN_TEST(socket_addresses)
|
|||||||
TEST_SUCC(close(sk));
|
TEST_SUCC(close(sk));
|
||||||
}
|
}
|
||||||
END_TEST()
|
END_TEST()
|
||||||
|
|
||||||
|
static int sk_unbound;
|
||||||
|
static int sk_bound;
|
||||||
|
static int sk_listen;
|
||||||
|
static int sk_connected;
|
||||||
|
static int sk_accepted;
|
||||||
|
|
||||||
|
#define UNNAMED_ADDR \
|
||||||
|
((struct sockaddr_un){ .sun_family = AF_UNIX, .sun_path = "" })
|
||||||
|
#define UNNAMED_ADDRLEN PATH_OFFSET
|
||||||
|
|
||||||
|
#define BOUND_ADDR \
|
||||||
|
((struct sockaddr_un){ .sun_family = AF_UNIX, .sun_path = "/tmp/B0" })
|
||||||
|
#define BOUND_ADDRLEN (PATH_OFFSET + 8)
|
||||||
|
|
||||||
|
#define LISTEN_ADDR \
|
||||||
|
((struct sockaddr_un){ .sun_family = AF_UNIX, .sun_path = "/tmp/L0" })
|
||||||
|
#define LISTEN_ADDRLEN (PATH_OFFSET + 8)
|
||||||
|
|
||||||
|
FN_SETUP(unbound)
|
||||||
|
{
|
||||||
|
sk_unbound = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
|
||||||
|
}
|
||||||
|
END_SETUP()
|
||||||
|
|
||||||
|
FN_SETUP(bound)
|
||||||
|
{
|
||||||
|
sk_bound = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
|
||||||
|
|
||||||
|
CHECK(bind(sk_bound, (struct sockaddr *)&BOUND_ADDR, BOUND_ADDRLEN));
|
||||||
|
}
|
||||||
|
END_SETUP()
|
||||||
|
|
||||||
|
FN_SETUP(listen)
|
||||||
|
{
|
||||||
|
sk_listen = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
|
||||||
|
|
||||||
|
CHECK(bind(sk_listen, (struct sockaddr *)&LISTEN_ADDR, LISTEN_ADDRLEN));
|
||||||
|
|
||||||
|
CHECK(listen(sk_listen, 1));
|
||||||
|
}
|
||||||
|
END_SETUP()
|
||||||
|
|
||||||
|
FN_SETUP(connected)
|
||||||
|
{
|
||||||
|
sk_connected = CHECK(socket(PF_UNIX, SOCK_STREAM, 0));
|
||||||
|
|
||||||
|
CHECK(connect(sk_connected, (struct sockaddr *)&LISTEN_ADDR,
|
||||||
|
LISTEN_ADDRLEN));
|
||||||
|
}
|
||||||
|
END_SETUP()
|
||||||
|
|
||||||
|
FN_SETUP(accepted)
|
||||||
|
{
|
||||||
|
sk_accepted = CHECK(accept(sk_listen, NULL, NULL));
|
||||||
|
}
|
||||||
|
END_SETUP()
|
||||||
|
|
||||||
|
FN_TEST(getsockname)
|
||||||
|
{
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
socklen_t addrlen;
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getsockname(sk_unbound, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == UNNAMED_ADDRLEN &&
|
||||||
|
memcmp(&addr, &UNNAMED_ADDR, UNNAMED_ADDRLEN) == 0);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getsockname(sk_bound, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == BOUND_ADDRLEN &&
|
||||||
|
memcmp(&addr, &BOUND_ADDR, BOUND_ADDRLEN) == 0);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getsockname(sk_listen, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == LISTEN_ADDRLEN &&
|
||||||
|
memcmp(&addr, &LISTEN_ADDR, LISTEN_ADDRLEN) == 0);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getsockname(sk_connected, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == UNNAMED_ADDRLEN &&
|
||||||
|
memcmp(&addr, &UNNAMED_ADDR, UNNAMED_ADDRLEN) == 0);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getsockname(sk_accepted, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == LISTEN_ADDRLEN &&
|
||||||
|
memcmp(&addr, &LISTEN_ADDR, LISTEN_ADDRLEN) == 0);
|
||||||
|
}
|
||||||
|
END_TEST()
|
||||||
|
|
||||||
|
FN_TEST(getpeername)
|
||||||
|
{
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
socklen_t addrlen;
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_ERRNO(getpeername(sk_unbound, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
ENOTCONN);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_ERRNO(getpeername(sk_bound, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
ENOTCONN);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_ERRNO(getpeername(sk_listen, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
ENOTCONN);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getpeername(sk_connected, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == LISTEN_ADDRLEN &&
|
||||||
|
memcmp(&addr, &LISTEN_ADDR, LISTEN_ADDRLEN) == 0);
|
||||||
|
|
||||||
|
addrlen = sizeof(addr);
|
||||||
|
TEST_RES(getpeername(sk_accepted, (struct sockaddr *)&addr, &addrlen),
|
||||||
|
addrlen == UNNAMED_ADDRLEN &&
|
||||||
|
memcmp(&addr, &UNNAMED_ADDR, UNNAMED_ADDRLEN) == 0);
|
||||||
|
}
|
||||||
|
END_TEST()
|
||||||
|
Reference in New Issue
Block a user