Skip to content

Commit 515a4fd

Browse files
committed
Deduplicate listening addresses
1 parent f20bc57 commit 515a4fd

1 file changed

Lines changed: 11 additions & 9 deletions

File tree

src/main.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use netlink::{
1212
};
1313
use procfs::process::all_processes;
1414
use 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

168168
fn 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

Comments
 (0)