From 1749566cf56e01b155f06ba68d1b787817d12df5 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 4 Jun 2021 16:19:08 -0700 Subject: [PATCH] Only check for ENOSPC on inotify_add_watch According to the inotify documentation, the only function that returns ENOSPC is `inotify_add_watch`, so this moves the check for this error code to the `inotify.add_watch()` call point. This makes sure someone using a different watcher like PollWatcher on linux won't reinterpret this error. Also, this uses `libc::ENOSPC` instead of `28` because it's easier to interpret from the inotify documentation. --- src/error.rs | 5 ----- src/inotify.rs | 11 +++++++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/error.rs b/src/error.rs index 9c456e43..b4d09f66 100644 --- a/src/error.rs +++ b/src/error.rs @@ -78,11 +78,6 @@ impl Error { /// Creates a new i/o Error from a stdlib `io::Error`. pub fn io(err: io::Error) -> Self { - // do not report inotify limits as "no more space" on linux #266 - #[cfg(target_os = "linux")] - if err.raw_os_error() == Some(28) { - return Self::new(ErrorKind::MaxFilesWatch); - } Self::new(ErrorKind::Io(err)) } diff --git a/src/inotify.rs b/src/inotify.rs index 675a7284..12d14073 100644 --- a/src/inotify.rs +++ b/src/inotify.rs @@ -5,7 +5,7 @@ //! will return events for the directory itself, and for files inside the directory. use super::event::*; -use super::{Config, Error, EventFn, RecursiveMode, Result, Watcher}; +use super::{Config, Error, ErrorKind, EventFn, RecursiveMode, Result, Watcher}; use crossbeam_channel::{bounded, unbounded, Sender}; use inotify as inotify_sys; use inotify_sys::{EventMask, Inotify, WatchDescriptor, WatchMask}; @@ -481,7 +481,14 @@ impl EventLoop { if let Some(ref mut inotify) = self.inotify { match inotify.add_watch(&path, watchmask) { - Err(e) => Err(Error::io(e)), + Err(e) => { + // do not report inotify limits as "no more space" on linux #266 + if e.raw_os_error() == Some(libc::ENOSPC) { + Err(Error::new(ErrorKind::MaxFilesWatch)) + } else { + Err(Error::io(e)) + } + } Ok(w) => { watchmask.remove(WatchMask::MASK_ADD); self.watches