diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-05-03 03:28:41 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-03 03:28:41 +0000 |
commit | 3109a6dab4bc8e29a537c31e51208cc82cd369dd (patch) | |
tree | 0612d9c58f530664ad93be6a07aeeb748358ac6a | |
parent | 4d79e93904b5f679ea14c382e778404fab306dd0 (diff) | |
parent | 024c0d7ddefc5458911242d61a89f44b5a3b5a38 (diff) | |
download | nix-3109a6dab4bc8e29a537c31e51208cc82cd369dd.zip |
Merge #1711
1711: Restore conversions from ip v4/6 Sockaddr types to std::net equivalents. r=asomers a=khuey
Fixes #1710
Co-authored-by: Kyle Huey <khuey@kylehuey.com>
-rw-r--r-- | CHANGELOG.md | 5 | ||||
-rw-r--r-- | src/sys/socket/addr.rs | 22 | ||||
-rw-r--r-- | test/sys/test_socket.rs | 13 |
3 files changed, 40 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e79d37a..8e9baf90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] - ReleaseDate ### Added + +- impl From<SockaddrIn> for std::net::SocketAddrV4 and + impl From<SockaddrIn6> for std::net::SocketAddrV6. + (#[1711](https://github.com/nix-rust/nix/pull/1711)) + ### Changed ### Fixed ### Removed diff --git a/src/sys/socket/addr.rs b/src/sys/socket/addr.rs index 52d60ac9..5cd4678c 100644 --- a/src/sys/socket/addr.rs +++ b/src/sys/socket/addr.rs @@ -1234,6 +1234,16 @@ impl From<net::SocketAddrV4> for SockaddrIn { } #[cfg(feature = "net")] +impl From<SockaddrIn> for net::SocketAddrV4 { + fn from(addr: SockaddrIn) -> Self { + net::SocketAddrV4::new( + net::Ipv4Addr::from(addr.0.sin_addr.s_addr.to_ne_bytes()), + u16::from_be(addr.0.sin_port) + ) + } +} + +#[cfg(feature = "net")] impl std::str::FromStr for SockaddrIn { type Err = net::AddrParseError; @@ -1330,6 +1340,18 @@ impl From<net::SocketAddrV6> for SockaddrIn6 { } #[cfg(feature = "net")] +impl From<SockaddrIn6> for net::SocketAddrV6 { + fn from(addr: SockaddrIn6) -> Self { + net::SocketAddrV6::new( + net::Ipv6Addr::from(addr.0.sin6_addr.s6_addr), + u16::from_be(addr.0.sin6_port), + u32::from_be(addr.0.sin6_flowinfo), + u32::from_be(addr.0.sin6_scope_id) + ) + } +} + +#[cfg(feature = "net")] impl std::str::FromStr for SockaddrIn6 { type Err = net::AddrParseError; diff --git a/test/sys/test_socket.rs b/test/sys/test_socket.rs index 2aac7958..c742960a 100644 --- a/test/sys/test_socket.rs +++ b/test/sys/test_socket.rs @@ -257,6 +257,19 @@ pub fn test_socketpair() { assert_eq!(&buf[..], b"hello"); } +#[test] +pub fn test_std_conversions() { + use nix::sys::socket::*; + + let std_sa = SocketAddrV4::from_str("127.0.0.1:6789").unwrap(); + let sock_addr = SockaddrIn::from(std_sa); + assert_eq!(std_sa, sock_addr.into()); + + let std_sa = SocketAddrV6::from_str("[::1]:6000").unwrap(); + let sock_addr: SockaddrIn6 = SockaddrIn6::from(std_sa); + assert_eq!(std_sa, sock_addr.into()); +} + mod recvfrom { use nix::Result; use nix::sys::socket::*; |