Skip to content

Commit 0362f42

Browse files
committed
Impl ToSocketAddrs for SocketAddress
1 parent 20f287f commit 0362f42

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

lightning/src/ln/msgs.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,33 @@ impl From<std::net::SocketAddr> for SocketAddress {
956956
}
957957
}
958958

959+
#[cfg(feature = "std")]
960+
impl std::net::ToSocketAddrs for SocketAddress {
961+
type Iter = std::option::IntoIter<std::net::SocketAddr>;
962+
963+
fn to_socket_addrs(&self) -> std::io::Result<Self::Iter> {
964+
match self {
965+
SocketAddress::TcpIpV4 { addr, port } => {
966+
let ip_addr = std::net::Ipv4Addr::from(*addr);
967+
(ip_addr, *port).to_socket_addrs()
968+
}
969+
SocketAddress::TcpIpV6 { addr, port } => {
970+
let ip_addr = std::net::Ipv6Addr::from(*addr);
971+
(ip_addr, *port).to_socket_addrs()
972+
}
973+
SocketAddress::Hostname { ref hostname, port } => {
974+
Ok((hostname.as_str(), *port).to_socket_addrs()?.next().into_iter())
975+
}
976+
SocketAddress::OnionV2(..) => {
977+
Err(std::io::Error::from(std::io::ErrorKind::Unsupported))
978+
}
979+
SocketAddress::OnionV3 { .. } => {
980+
Err(std::io::Error::from(std::io::ErrorKind::Unsupported))
981+
}
982+
}
983+
}
984+
}
985+
959986
fn parse_onion_address(host: &str, port: u16) -> Result<SocketAddress, SocketAddressParseError> {
960987
if host.ends_with(".onion") {
961988
let domain = &host[..host.len() - ".onion".len()];
@@ -2671,7 +2698,7 @@ mod tests {
26712698
use crate::chain::transaction::OutPoint;
26722699

26732700
#[cfg(feature = "std")]
2674-
use std::net::{Ipv4Addr, Ipv6Addr};
2701+
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, ToSocketAddrs};
26752702
use crate::ln::msgs::SocketAddressParseError;
26762703

26772704
#[test]
@@ -4100,4 +4127,27 @@ mod tests {
41004127
assert!("invalid-address".parse::<SocketAddress>().is_err());
41014128
assert!(SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion.onion:1234").is_err());
41024129
}
4130+
4131+
#[test]
4132+
#[cfg(feature = "std")]
4133+
fn test_socket_address_to_socket_addrs() {
4134+
assert_eq!(SocketAddress::TcpIpV4 {addr:[0u8; 4], port: 1337,}.to_socket_addrs().unwrap().next().unwrap(),
4135+
SocketAddr::V4(std::net::SocketAddrV4::new(std::net::Ipv4Addr::new(0,0,0,0),
4136+
1337)));
4137+
assert_eq!(SocketAddress::TcpIpV6 {addr:[0u8; 16], port: 1337,}.to_socket_addrs().unwrap().next().unwrap(),
4138+
SocketAddr::V6(std::net::SocketAddrV6::new(std::net::Ipv6Addr::from([0u8; 16]),
4139+
1337, 0, 0)));
4140+
assert_eq!(SocketAddress::Hostname { hostname: Hostname::try_from("0.0.0.0".to_string()).unwrap(), port: 0
4141+
}.to_socket_addrs().unwrap().next().unwrap(),
4142+
std::net::SocketAddr::V4(std::net::SocketAddrV4::new(
4143+
std::net::Ipv4Addr::from([0u8; 4]),0)));
4144+
assert!(SocketAddress::OnionV2([0u8; 12]).to_socket_addrs().is_err());
4145+
assert!(SocketAddress::OnionV3{
4146+
ed25519_pubkey: [37, 24, 75, 5, 25, 73, 117, 194, 139, 102, 182, 107, 4, 105, 247, 246, 85,
4147+
111, 177, 172, 49, 137, 167, 155, 64, 221, 163, 47, 31, 33, 71, 3],
4148+
checksum: 48326,
4149+
version: 121,
4150+
port: 1234
4151+
}.to_socket_addrs().is_err());
4152+
}
41034153
}

0 commit comments

Comments
 (0)