@@ -12,7 +12,7 @@ use crate::hash;
1212use crate :: io:: Write as IoWrite ;
1313use crate :: mem:: transmute;
1414use crate :: sys:: net:: netc as c;
15- use crate :: sys_common:: { AsInner , FromInner } ;
15+ use crate :: sys_common:: { AsInner , FromInner , IntoInner } ;
1616
1717/// An IP address, either IPv4 or IPv6.
1818///
@@ -909,7 +909,10 @@ impl Eq for Ipv4Addr {}
909909#[ stable( feature = "rust1" , since = "1.0.0" ) ]
910910impl hash:: Hash for Ipv4Addr {
911911 fn hash < H : hash:: Hasher > ( & self , s : & mut H ) {
912- // `inner` is #[repr(packed)], so we need to copy `s_addr`.
912+ // NOTE:
913+ // * hash in big endian order
914+ // * in netbsd, `in_addr` has `repr(packed)`, we need to
915+ // copy `s_addr` to avoid unsafe borrowing
913916 { self . inner . s_addr } . hash ( s)
914917 }
915918}
@@ -944,13 +947,14 @@ impl PartialOrd<IpAddr> for Ipv4Addr {
944947#[ stable( feature = "rust1" , since = "1.0.0" ) ]
945948impl Ord for Ipv4Addr {
946949 fn cmp ( & self , other : & Ipv4Addr ) -> Ordering {
950+ // Compare as native endian
947951 u32:: from_be ( self . inner . s_addr ) . cmp ( & u32:: from_be ( other. inner . s_addr ) )
948952 }
949953}
950954
951- impl AsInner < c:: in_addr > for Ipv4Addr {
952- fn as_inner ( & self ) -> & c:: in_addr {
953- & self . inner
955+ impl IntoInner < c:: in_addr > for Ipv4Addr {
956+ fn into_inner ( self ) -> c:: in_addr {
957+ self . inner
954958 }
955959}
956960
@@ -2019,6 +2023,7 @@ mod tests {
20192023
20202024 #[ test]
20212025 fn ipv4_addr_to_string ( ) {
2026+ assert_eq ! ( Ipv4Addr :: new( 127 , 0 , 0 , 1 ) . to_string( ) , "127.0.0.1" ) ;
20222027 // Short address
20232028 assert_eq ! ( Ipv4Addr :: new( 1 , 1 , 1 , 1 ) . to_string( ) , "1.1.1.1" ) ;
20242029 // Long address
0 commit comments