]> git.eshelyaron.com Git - emacs.git/commitdiff
Enable inotify on systems with inotify_init yet no init1 variant
authorPo Lu <luangruo@yahoo.com>
Thu, 22 Feb 2024 01:53:48 +0000 (09:53 +0800)
committerEshel Yaron <me@eshelyaron.com>
Wed, 28 Feb 2024 17:39:39 +0000 (18:39 +0100)
* configure.ac (HAVE_INOTIFY): Check for the presence of
inotify_init in addition to inotify_init1.

* src/inotify.c (Finotify_add_watch): Implement with
inotify_init if inotify_init1 is absent.

(cherry picked from commit 39a84232700c40fa74305970dd16cd5cb8b8bea0)

configure.ac
src/inotify.c

index b9bcb9a4648ab44f18722ff6f433e0e8f8f3e6ca..f582d1331dbb3089e35dd9947adc87d62f3f9541 100644 (file)
@@ -4121,16 +4121,16 @@ case $with_file_notification,$opsys in
     fi ;;
 esac
 
-dnl inotify is available only on GNU/Linux.
+dnl inotify is available only on Linux-kernel based systems.
 case $with_file_notification,$NOTIFY_OBJ in
   inotify, | yes,)
     AC_CHECK_HEADER([sys/inotify.h])
     if test "$ac_cv_header_sys_inotify_h" = yes ; then
-       AC_CHECK_FUNC([inotify_init1])
-       if test "$ac_cv_func_inotify_init1" = yes; then
+       AC_CHECK_FUNCS([inotify_init inotify_init1])
+       if test "$ac_cv_func_inotify_init" = yes; then
          AC_DEFINE([HAVE_INOTIFY], [1], [Define to 1 to use inotify.])
          NOTIFY_OBJ=inotify.o
-         NOTIFY_SUMMARY="yes -lglibc (inotify)"
+         NOTIFY_SUMMARY="yes (inotify)"
        fi
     fi ;;
 esac
index 2ee874530cc513ac00f88c3ddd6409100622dd24..7140568f1b69d477a3d70f8ca7683d4e778d2c85 100644 (file)
@@ -26,6 +26,8 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "termhooks.h"
 
 #include <errno.h>
+#include <fcntl.h>
+
 #include <sys/inotify.h>
 #include <sys/ioctl.h>
 
@@ -434,7 +436,15 @@ IN_ONESHOT  */)
 
   if (inotifyfd < 0)
     {
+#ifdef HAVE_INOTIFY_INIT1
       inotifyfd = inotify_init1 (IN_NONBLOCK | IN_CLOEXEC);
+#else /* !HAVE_INOTIFY_INIT1 */
+      /* This is prey to race conditions with other threads calling
+        exec.  */
+      inotifyfd = inotify_init ();
+      fcntl (inotifyfd, F_SETFL, O_NONBLOCK);
+      fcntl (inotifyfd, F_SETFD, O_CLOEXEC);
+#endif /* HAVE_INOTIFY_INIT1 */
       if (inotifyfd < 0)
        report_file_notify_error ("File watching is not available", Qnil);
       watch_list = Qnil;