@@ -12,7 +12,7 @@ use netlink::{
1212} ;
1313use procfs:: process:: all_processes;
1414use std:: {
15- collections:: { BTreeMap , HashMap } ,
15+ collections:: { BTreeMap , BTreeSet , HashMap } ,
1616 env:: var_os,
1717 io:: { stdout, BufWriter , Write } ,
1818 net:: { IpAddr , Ipv4Addr , Ipv6Addr } ,
@@ -166,7 +166,7 @@ fn interfaces_routes() -> IfaceInfo {
166166}
167167
168168fn sockets_tree < ' a > (
169- sockets : impl IntoIterator < Item = impl Deref < Target = SockInfo < ' a > > > ,
169+ sockets : impl IntoIterator < Item = impl Deref < Target = SockInfo < ' a > > + std :: cmp :: Ord > ,
170170 filter : & options:: Filters ,
171171) -> termtree:: Tree {
172172 let mut pout = termtree:: Tree :: new ( ) ;
@@ -184,14 +184,16 @@ fn sockets_tree<'a>(
184184 {
185185 sout. leaf ( "0.0.0.0 + ::" . into ( ) ) ;
186186 } else {
187+ let socks = socks
188+ . iter ( )
189+ . filter ( |sock| filter. accept_addr ( sock. addr ) )
190+ . collect :: < BTreeSet < _ > > ( ) ;
187191 for sock in socks {
188- if filter. accept_addr ( sock. addr ) {
189- match ( sock. family , sock. iface ) {
190- ( Family :: Both , _) => sout. leaf ( "*" . into ( ) ) ,
191- ( _, Some ( ifname) ) => sout. leaf ( format ! ( "{} ({ifname})" , sock. addr) ) ,
192- _ => sout. leaf ( format ! ( "{}" , sock. addr) ) ,
193- } ;
194- }
192+ match ( sock. family , sock. iface ) {
193+ ( Family :: Both , _) => sout. leaf ( "*" . into ( ) ) ,
194+ ( _, Some ( ifname) ) => sout. leaf ( format ! ( "{} ({ifname})" , sock. addr) ) ,
195+ _ => sout. leaf ( format ! ( "{}" , sock. addr) ) ,
196+ } ;
195197 }
196198 }
197199 if filter. accept_port ( port) && filter. accept_proto ( proto) {
0 commit comments