@@ -36,12 +36,26 @@ pub enum InetAddr {
36
36
37
37
impl InetAddr {
38
38
pub fn from_std ( std : & net:: SocketAddr ) -> InetAddr {
39
- let ip = match * std {
40
- net:: SocketAddr :: V4 ( ref addr) => IpAddr :: V4 ( Ipv4Addr :: from_std ( & addr. ip ( ) ) ) ,
41
- net:: SocketAddr :: V6 ( ref addr) => IpAddr :: V6 ( Ipv6Addr :: from_std ( & addr. ip ( ) ) ) ,
42
- } ;
43
-
44
- InetAddr :: new ( ip, std. port ( ) )
39
+ match * std {
40
+ net:: SocketAddr :: V4 ( ref addr) => {
41
+ InetAddr :: V4 ( libc:: sockaddr_in {
42
+ sin_family : AddressFamily :: Inet as sa_family_t ,
43
+ sin_port : addr. port ( ) . to_be ( ) , // network byte order
44
+ sin_addr : Ipv4Addr :: from_std ( addr. ip ( ) ) . 0 ,
45
+ .. unsafe { mem:: zeroed ( ) }
46
+ } )
47
+ }
48
+ net:: SocketAddr :: V6 ( ref addr) => {
49
+ InetAddr :: V6 ( libc:: sockaddr_in6 {
50
+ sin6_family : AddressFamily :: Inet6 as sa_family_t ,
51
+ sin6_port : addr. port ( ) . to_be ( ) , // network byte order
52
+ sin6_addr : Ipv6Addr :: from_std ( addr. ip ( ) ) . 0 ,
53
+ sin6_flowinfo : addr. flowinfo ( ) , // host byte order
54
+ sin6_scope_id : addr. scope_id ( ) , // host byte order
55
+ .. unsafe { mem:: zeroed ( ) }
56
+ } )
57
+ }
58
+ }
45
59
}
46
60
47
61
pub fn new ( ip : IpAddr , port : u16 ) -> InetAddr {
0 commit comments