@@ -16,16 +16,6 @@ use ::sys::socket::addr::netlink::NetlinkAddr;
16
16
*
17
17
*/
18
18
19
- #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
20
- #[ derive( Copy , Clone , PartialEq , Eq , Debug , Hash ) ]
21
- #[ repr( C ) ]
22
- pub struct sockaddr_nl {
23
- pub nl_family : sa_family_t ,
24
- nl_pad : libc:: c_ushort ,
25
- pub nl_pid : u32 ,
26
- pub nl_groups : u32
27
- }
28
-
29
19
#[ repr( i32 ) ]
30
20
#[ derive( Copy , Clone , PartialEq , Eq , Debug , Hash ) ]
31
21
pub enum AddressFamily {
@@ -502,7 +492,7 @@ impl SockAddr {
502
492
SockAddr :: Inet ( InetAddr :: V6 ( ref addr) ) => ( mem:: transmute ( addr) , mem:: size_of :: < libc:: sockaddr_in6 > ( ) as libc:: socklen_t ) ,
503
493
SockAddr :: Unix ( UnixAddr ( ref addr, len) ) => ( mem:: transmute ( addr) , ( len + mem:: size_of :: < libc:: sa_family_t > ( ) ) as libc:: socklen_t ) ,
504
494
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
505
- SockAddr :: Netlink ( NetlinkAddr ( ref sa) ) => ( mem:: transmute ( sa) , mem:: size_of :: < sockaddr_nl > ( ) as libc:: socklen_t ) ,
495
+ SockAddr :: Netlink ( NetlinkAddr ( ref sa) ) => ( mem:: transmute ( sa) , mem:: size_of :: < libc :: sockaddr_nl > ( ) as libc:: socklen_t ) ,
506
496
}
507
497
}
508
498
}
@@ -558,21 +548,41 @@ impl fmt::Display for SockAddr {
558
548
559
549
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
560
550
pub mod netlink {
561
- use :: sys:: socket:: addr:: { AddressFamily , sockaddr_nl} ;
562
- use libc:: sa_family_t;
563
- use std:: fmt;
551
+ use :: sys:: socket:: addr:: { AddressFamily } ;
552
+ use libc:: { sa_family_t, sockaddr_nl} ;
553
+ use std:: { fmt, mem} ;
554
+ use std:: hash:: { Hash , Hasher } ;
564
555
565
- #[ derive( Copy , Clone , PartialEq , Eq , Debug , Hash ) ]
556
+ #[ derive( Copy , Clone ) ]
566
557
pub struct NetlinkAddr ( pub sockaddr_nl ) ;
567
558
559
+ // , PartialEq, Eq, Debug, Hash
560
+ impl PartialEq for NetlinkAddr {
561
+ fn eq ( & self , other : & Self ) -> bool {
562
+ let ( inner, other) = ( self . 0 , other. 0 ) ;
563
+ ( inner. nl_family , inner. nl_pid , inner. nl_groups ) ==
564
+ ( other. nl_family , other. nl_pid , other. nl_groups )
565
+ }
566
+ }
567
+
568
+ impl Eq for NetlinkAddr { }
569
+
570
+ impl Hash for NetlinkAddr {
571
+ fn hash < H : Hasher > ( & self , s : & mut H ) {
572
+ let inner = self . 0 ;
573
+ ( inner. nl_family , inner. nl_pid , inner. nl_groups ) . hash ( s) ;
574
+ }
575
+ }
576
+
577
+
568
578
impl NetlinkAddr {
569
579
pub fn new ( pid : u32 , groups : u32 ) -> NetlinkAddr {
570
- NetlinkAddr ( sockaddr_nl {
571
- nl_family : AddressFamily :: Netlink as sa_family_t ,
572
- nl_pad : 0 ,
573
- nl_pid : pid ,
574
- nl_groups : groups ,
575
- } )
580
+ let mut addr : sockaddr_nl = unsafe { mem :: zeroed ( ) } ;
581
+ addr . nl_family = AddressFamily :: Netlink as sa_family_t ;
582
+ addr . nl_pid = pid ;
583
+ addr . nl_groups = groups ;
584
+
585
+ NetlinkAddr ( addr )
576
586
}
577
587
578
588
pub fn pid ( & self ) -> u32 {
0 commit comments