forked from notify-rs/notify
-
Notifications
You must be signed in to change notification settings - Fork 1
/
poll_sysfs.rs
57 lines (53 loc) · 1.9 KB
/
poll_sysfs.rs
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/// Example for watching kernel internal filesystems like `/sys` and `/proc`
/// These can't be watched by the default backend or unconfigured pollwatcher
/// This example can't be demonstrated under windows, it might be relevant for network shares
#[cfg(not(target_os = "windows"))]
fn not_windows_main() -> notify::Result<()> {
use notify::{Config, PollWatcher, RecursiveMode, Watcher};
use std::path::Path;
use std::time::Duration;
let mut paths: Vec<_> = std::env::args()
.skip(1)
.map(|arg| Path::new(&arg).to_path_buf())
.collect();
if paths.is_empty() {
let lo_stats = Path::new("/sys/class/net/lo/statistics/tx_bytes").to_path_buf();
if !lo_stats.exists() {
eprintln!("Must provide path to watch, default system path was not found (probably you're not running on Linux?)");
std::process::exit(1);
}
println!(
"Trying {:?}, use `ping localhost` to see changes!",
lo_stats
);
paths.push(lo_stats);
}
println!("watching {:?}...", paths);
// configure pollwatcher backend
let config = Config::default()
.with_compare_contents(true) // crucial part for pseudo filesystems
.with_poll_interval(Duration::from_secs(2));
let (tx, rx) = std::sync::mpsc::channel();
// create pollwatcher backend
let mut watcher = PollWatcher::new(tx, config)?;
for path in paths {
// watch all paths
watcher.watch(&path, RecursiveMode::Recursive)?;
}
// print all events, never returns
for res in rx {
match res {
Ok(event) => println!("changed: {:?}", event),
Err(e) => println!("watch error: {:?}", e),
}
}
Ok(())
}
fn main() -> notify::Result<()> {
#[cfg(not(target_os = "windows"))]
{
not_windows_main()
}
#[cfg(target_os = "windows")]
notify::Result::Ok(())
}