use std::{fs, io}; use std::net::IpAddr; use std::path::Path; use if_addrs::{get_if_addrs, IfAddr, Interface}; fn print_single_interface>(iface: Interface, port: &u16, path: P) -> io::Result<()> { for entry in fs::read_dir(path)? { let entry = entry?; let entry_path = entry.path(); if entry_path.is_dir() { continue } let filename = entry_path.file_name().unwrap(); if let IfAddr::V4(_) = iface.addr { println!("http://{}:{}/{}", iface.ip(), port, filename.to_str().unwrap()); } } Ok(()) } fn is_last_octet_one(ip: IpAddr) -> bool { match ip { IpAddr::V4(addr) => addr.octets()[3] == 1, _ => false } } pub fn print_interface>(iface_str: &str, port: &u16, path: P) { for iface in get_if_addrs().unwrap() { if iface_str == "all" { if iface.is_loopback() || is_last_octet_one(iface.ip()) { continue } } else { if iface_str != iface.name { continue } } print_single_interface(iface, port, &path).unwrap(); } }