summaryrefslogtreecommitdiffstats
path: root/third_party/rust/libudev/examples/monitor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/libudev/examples/monitor.rs')
-rw-r--r--third_party/rust/libudev/examples/monitor.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/third_party/rust/libudev/examples/monitor.rs b/third_party/rust/libudev/examples/monitor.rs
new file mode 100644
index 0000000000..ad9dedcbd0
--- /dev/null
+++ b/third_party/rust/libudev/examples/monitor.rs
@@ -0,0 +1,70 @@
+extern crate libudev;
+extern crate libc;
+
+use std::io;
+use std::ptr;
+use std::thread;
+use std::time::Duration;
+
+use std::os::unix::io::{AsRawFd};
+
+use libc::{c_void,c_int,c_short,c_ulong,timespec};
+
+#[repr(C)]
+struct pollfd {
+ fd: c_int,
+ events: c_short,
+ revents: c_short,
+}
+
+#[repr(C)]
+struct sigset_t {
+ __private: c_void
+}
+
+#[allow(non_camel_case_types)]
+type nfds_t = c_ulong;
+
+const POLLIN: c_short = 0x0001;
+
+extern "C" {
+ fn ppoll(fds: *mut pollfd, nfds: nfds_t, timeout_ts: *mut libc::timespec, sigmask: *const sigset_t) -> c_int;
+}
+
+fn main() {
+ let context = libudev::Context::new().unwrap();
+ monitor(&context).unwrap();
+}
+
+fn monitor(context: &libudev::Context) -> io::Result<()> {
+ let mut monitor = try!(libudev::Monitor::new(&context));
+
+ try!(monitor.match_subsystem_devtype("usb", "usb_device"));
+ let mut socket = try!(monitor.listen());
+
+ let mut fds = vec!(pollfd { fd: socket.as_raw_fd(), events: POLLIN, revents: 0 });
+
+ loop {
+ let result = unsafe { ppoll((&mut fds[..]).as_mut_ptr(), fds.len() as nfds_t, ptr::null_mut(), ptr::null()) };
+
+ if result < 0 {
+ return Err(io::Error::last_os_error());
+ }
+
+ let event = match socket.receive_event() {
+ Some(evt) => evt,
+ None => {
+ thread::sleep(Duration::from_millis(10));
+ continue;
+ }
+ };
+
+ println!("{}: {} {} (subsystem={}, sysname={}, devtype={})",
+ event.sequence_number(),
+ event.event_type(),
+ event.syspath().to_str().unwrap_or("---"),
+ event.subsystem().to_str().unwrap_or(""),
+ event.sysname().to_str().unwrap_or(""),
+ event.devtype().map_or("", |s| { s.to_str().unwrap_or("") }));
+ }
+}