diff --git a/NEWS b/NEWS index a97dcaa..355e10b 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ += Next Release: 4.7 + + - Use system file descriptor limits when max_user_watches is not accessible + = Release History == 4.6: July 1, 2020 diff --git a/entr.c b/entr.c index 3316f47..ec3d569 100644 --- a/entr.c +++ b/entr.c @@ -105,6 +105,7 @@ static void watch_loop(int, char *[]); int main(int argc, char *argv[]) { struct rlimit rl; + rlim_t max_watches; int kq; struct sigaction act; int ttyfd; @@ -155,14 +156,20 @@ main(int argc, char *argv[]) { err(1, "Failed to set SIGCHLD handler"); getrlimit(RLIMIT_NOFILE, &rl); + #if defined(_LINUX_PORT) - rl.rlim_cur = (rlim_t)fs_sysctl(INOTIFY_MAX_USER_WATCHES); -#else + max_watches = (rlim_t)fs_sysctl(INOTIFY_MAX_USER_WATCHES); + if(max_watches > 0) { + rl.rlim_cur = max_watches; + goto rlim_set; + } +#endif /* raise soft limit */ rl.rlim_cur = min((rlim_t)sysconf(_SC_OPEN_MAX), rl.rlim_max); if (setrlimit(RLIMIT_NOFILE, &rl) != 0) err(1, "setrlimit cannot set rlim_cur to %d", (int)rl.rlim_cur); -#endif + +rlim_set: /* prevent interactive utilities from paging output */ setenv("PAGER", "/bin/cat", 0); diff --git a/missing/kqueue_inotify.c b/missing/kqueue_inotify.c index 3ddd064..9465d94 100644 --- a/missing/kqueue_inotify.c +++ b/missing/kqueue_inotify.c @@ -57,16 +57,21 @@ int fs_sysctl(const int name) { FILE *file; char line[8]; - int value = 0; + int value; switch(name) { case INOTIFY_MAX_USER_WATCHES: file = fopen("/proc/sys/fs/inotify/max_user_watches", "r"); - if (file == NULL || fgets(line, sizeof(line), file) == NULL) - err(1, "max_user_watches"); - value = atoi(line); - fclose(file); + if (file == NULL || fgets(line, sizeof(line), file) == NULL) { + /* failed to read max_user_watches; sometimes inaccessible on Android */ + value = 0; + } + else + value = atoi(line); + + if (file) + fclose(file); break; } return value;