diff options
author | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2024-03-25 20:30:13 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 20:30:13 +0800 |
commit | 7dbd3719e731b34d8ba8086e0ddd034ea0eaf2e6 (patch) | |
tree | 229cc9f2bca59828867726027c2d65af58d9bab7 /src | |
parent | 451daea0aca8c241c6cc3e33aabf5aed57ddd0e8 (diff) |
Fix IPv6 socket detect logic (#383)
* Fix IPv6 socket detect logic
* Write changelog
Diffstat (limited to 'src')
-rw-r--r-- | src/os/linux.rs | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/src/os/linux.rs b/src/os/linux.rs index fdd5ec1..08a4aeb 100644 --- a/src/os/linux.rs +++ b/src/os/linux.rs @@ -10,7 +10,7 @@ use crate::{ pub(crate) fn get_open_sockets() -> OpenSockets { let mut open_sockets = HashMap::new(); - let mut inode_to_procname = HashMap::new(); + let mut inode_to_proc = HashMap::new(); if let Ok(all_procs) = procfs::process::all_processes() { for process in all_procs.filter_map(|res| res.ok()) { @@ -20,47 +20,30 @@ pub(crate) fn get_open_sockets() -> OpenSockets { let proc_info = ProcessInfo::new(&proc_name, stat.pid as u32); for fd in fds.filter_map(|res| res.ok()) { if let FDTarget::Socket(inode) = fd.target { - inode_to_procname.insert(inode, proc_info.clone()); + inode_to_proc.insert(inode, proc_info.clone()); } } } } - if let Ok(mut tcp) = procfs::net::tcp() { - if let Ok(mut tcp6) = procfs::net::tcp6() { - tcp.append(&mut tcp6); - } - for entry in tcp.into_iter() { - if let Some(proc_info) = inode_to_procname.get(&entry.inode) { - open_sockets.insert( - LocalSocket { + macro_rules! insert_proto { + ($source: expr, $proto: expr) => { + let entries = $source.into_iter().filter_map(|res| res.ok()).flatten(); + for entry in entries { + if let Some(proc_info) = inode_to_proc.get(&entry.inode) { + let socket = LocalSocket { ip: entry.local_address.ip(), port: entry.local_address.port(), - protocol: Protocol::Tcp, - }, - proc_info.clone(), - ); - }; - } + protocol: $proto, + }; + open_sockets.insert(socket, proc_info.clone()); + } + } + }; } - if let Ok(mut udp) = procfs::net::udp() { - if let Ok(mut udp6) = procfs::net::udp6() { - udp.append(&mut udp6); - } - for entry in udp.into_iter() { - if let Some(proc_info) = inode_to_procname.get(&entry.inode) { - open_sockets.insert( - LocalSocket { - ip: entry.local_address.ip(), - port: entry.local_address.port(), - protocol: Protocol::Udp, - }, - proc_info.clone(), - ); - }; - } - } + insert_proto!([procfs::net::tcp(), procfs::net::tcp6()], Protocol::Tcp); + insert_proto!([procfs::net::udp(), procfs::net::udp6()], Protocol::Udp); OpenSockets { sockets_to_procs: open_sockets, |