aboutsummaryrefslogtreecommitdiff
path: root/src/utils/local_ip.rs
blob: 07f5c198ba508b6681eb72323599781756741535 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::config::CONFIG;
use crate::types::ThreadsData;

pub async fn get_local_ip() -> ThreadsData {
    let addrs = nix::ifaddrs::getifaddrs().unwrap();
    let mut ip  = String::new();
    let mut ip6 = String::new();
    let mut found4 = false;
    let mut found6 = false;
    for ifaddr in addrs {
        match ifaddr.address {
            Some(address) => {
                if found4 && found6 { break; }
                if ifaddr.interface_name == CONFIG.local_ip.interface {
                    match address.family() {
                        nix::sys::socket::AddressFamily::Inet => {
                            if found4 { continue; }
                            ip = address.to_string().split(':').next().unwrap().to_string();
                            found4 = true;
                        }
                        nix::sys::socket::AddressFamily::Inet6 => {
                            if found6 { continue; }
                            ip6 = address.to_string().rsplit_once(':').unwrap().0.to_string();
                            found6 = true;
                        }
                        _ => continue,
                    };
                }
            }
            None => continue,
        }
    }
    if ip.is_empty() {
        ip = String::from("Error!")
    }
    if !ip6.is_empty() {
        ip6 = format!(" {}", ip6)
    }
    let data = format!("  {}  {}{}  {}", CONFIG.local_ip.icon, ip, ip6, CONFIG.seperator);
    ThreadsData::LocalIp(data)
}