| 1 | //! Idiomatic inotify wrapper for the Rust programming language |
| 2 | //! |
| 3 | //! # About |
| 4 | //! |
| 5 | //! [inotify-rs] is an idiomatic wrapper around the Linux kernel's [inotify] API |
| 6 | //! for the Rust programming language. It can be used for monitoring changes to |
| 7 | //! files or directories. |
| 8 | //! |
| 9 | //! The [`Inotify`] struct is the main entry point into the API. |
| 10 | //! |
| 11 | //! # Example |
| 12 | //! |
| 13 | //! ``` |
| 14 | //! use inotify::{ |
| 15 | //! Inotify, |
| 16 | //! WatchMask, |
| 17 | //! }; |
| 18 | //! |
| 19 | //! let mut inotify = Inotify::init() |
| 20 | //! .expect("Error while initializing inotify instance" ); |
| 21 | //! |
| 22 | //! # // Create a temporary file, so `Watches::add` won't return an error. |
| 23 | //! # use std::fs::File; |
| 24 | //! # let mut test_file = File::create("/tmp/inotify-rs-test-file" ) |
| 25 | //! # .expect("Failed to create test file" ); |
| 26 | //! # |
| 27 | //! // Watch for modify and close events. |
| 28 | //! inotify |
| 29 | //! .watches() |
| 30 | //! .add( |
| 31 | //! "/tmp/inotify-rs-test-file" , |
| 32 | //! WatchMask::MODIFY | WatchMask::CLOSE, |
| 33 | //! ) |
| 34 | //! .expect("Failed to add file watch" ); |
| 35 | //! |
| 36 | //! # // Modify file, so the following `read_events_blocking` won't block. |
| 37 | //! # use std::io::Write; |
| 38 | //! # write!(&mut test_file, "something \n" ) |
| 39 | //! # .expect("Failed to write something to test file" ); |
| 40 | //! # |
| 41 | //! // Read events that were added with `Watches::add` above. |
| 42 | //! let mut buffer = [0; 1024]; |
| 43 | //! let events = inotify.read_events_blocking(&mut buffer) |
| 44 | //! .expect("Error while reading events" ); |
| 45 | //! |
| 46 | //! for event in events { |
| 47 | //! // Handle event |
| 48 | //! } |
| 49 | //! ``` |
| 50 | //! |
| 51 | //! # Attention: inotify gotchas |
| 52 | //! |
| 53 | //! inotify (as in, the Linux API, not this wrapper) has many edge cases, making |
| 54 | //! it hard to use correctly. This can lead to weird and hard to find bugs in |
| 55 | //! applications that are based on it. inotify-rs does its best to fix these |
| 56 | //! issues, but sometimes this would require an amount of runtime overhead that |
| 57 | //! is just unacceptable for a low-level wrapper such as this. |
| 58 | //! |
| 59 | //! We've documented any issues that inotify-rs has inherited from inotify, as |
| 60 | //! far as we are aware of them. Please watch out for any further warnings |
| 61 | //! throughout this documentation. If you want to be on the safe side, in case |
| 62 | //! we have missed something, please read the [inotify man pages] carefully. |
| 63 | //! |
| 64 | //! [inotify-rs]: https://crates.io/crates/inotify |
| 65 | //! [inotify]: https://en.wikipedia.org/wiki/Inotify |
| 66 | //! [inotify man pages]: http://man7.org/linux/man-pages/man7/inotify.7.html |
| 67 | |
| 68 | |
| 69 | #![deny (missing_docs)] |
| 70 | #![deny (warnings)] |
| 71 | #![deny (missing_debug_implementations)] |
| 72 | |
| 73 | |
| 74 | #[macro_use ] |
| 75 | extern crate bitflags; |
| 76 | |
| 77 | mod events; |
| 78 | mod fd_guard; |
| 79 | mod inotify; |
| 80 | mod util; |
| 81 | mod watches; |
| 82 | |
| 83 | #[cfg (feature = "stream" )] |
| 84 | mod stream; |
| 85 | |
| 86 | |
| 87 | pub use crate::events::{ |
| 88 | Event, |
| 89 | EventMask, |
| 90 | EventOwned, |
| 91 | Events, |
| 92 | }; |
| 93 | pub use crate::inotify::Inotify; |
| 94 | pub use crate::util::{ |
| 95 | get_buffer_size, |
| 96 | get_absolute_path_buffer_size, |
| 97 | }; |
| 98 | pub use crate::watches::{ |
| 99 | Watches, |
| 100 | WatchDescriptor, |
| 101 | WatchMask, |
| 102 | }; |
| 103 | |
| 104 | #[cfg (feature = "stream" )] |
| 105 | pub use self::stream::EventStream; |
| 106 | |