summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-05-03 03:28:41 +0000
committerGitHub <noreply@github.com>2022-05-03 03:28:41 +0000
commit3109a6dab4bc8e29a537c31e51208cc82cd369dd (patch)
tree0612d9c58f530664ad93be6a07aeeb748358ac6a
parent4d79e93904b5f679ea14c382e778404fab306dd0 (diff)
parent024c0d7ddefc5458911242d61a89f44b5a3b5a38 (diff)
downloadnix-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.md5
-rw-r--r--src/sys/socket/addr.rs22
-rw-r--r--test/sys/test_socket.rs13
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::*;