query/
query.rs

1extern crate p0f_api;
2
3use std::net::IpAddr;
4use std::str::FromStr;
5
6use p0f_api::P0f;
7
8pub fn main() {
9	// Program arguments: [ip addr] [p0f socket path]
10	let ip = std::env::args().nth(1).unwrap_or("127.0.0.1".into());
11	let path = std::env::args().nth(2).unwrap_or("p0f.sock".into());
12
13	// Try to connect to p0f socket.
14	let mut p0f = P0f::new_connect(&path).expect(&format!(r#"Could not connect to p0f socket "{}""#, &path));
15	// Try to parse IP address.
16	let addr = IpAddr::from_str(&ip).expect(&format!(r#"Invalid IP address: "{}"#, ip));
17
18	// Send query to p0f API.
19	let resp = p0f.query(&addr);
20
21	if let Ok(resp) = resp {
22		// We have a correct response.
23
24		if let Some(resp) = resp {
25			// Address is known by p0f.
26			println!("Ok: {:?} -> {:#?}.", addr, resp);
27		} else {
28			// Address is not known by p0f.
29			println!("p0f returned no match.");
30		}
31	} else if let Err(resp_err) = resp {
32		// We had en error communicating with API.
33		println!("Response error: {:#?}.", resp_err);
34	}
35
36	// Ipv4Addr query variant.
37	p0f.query_v4( &std::net::Ipv4Addr::new(127, 0, 0, 1) ).unwrap();
38	p0f.query_v4( &[127, 0, 0, 1].into() ).unwrap();
39	p0f.query_v4( &0x7f000001.into() ).unwrap();
40
41	// Ipv6Addr query variant.
42	p0f.query_v6( &std::net::Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1) ).unwrap();
43	p0f.query_v6( &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1].into() ).unwrap();
44}