#include "coding.h"
#include "process.h"
#include "keyboard.h"
-#include "character.h"
-#include "frame.h" /* Required for termhooks.h. */
#include "termhooks.h"
+#include <errno.h>
#include <sys/inotify.h>
#include <sys/ioctl.h>
to_read = 0;
if (ioctl (fd, FIONREAD, &to_read) == -1)
- xsignal1
- (Qfile_notify_error,
- build_string ("Error while trying to retrieve file system events"));
+ report_file_notify_error ("Error while retrieving file system events",
+ Qnil);
buffer = xmalloc (to_read);
n = read (fd, buffer, to_read);
if (n < 0)
{
xfree (buffer);
- xsignal1
- (Qfile_notify_error,
- build_string ("Error while trying to read file system events"));
+ report_file_notify_error ("Error while reading file system events", Qnil);
}
EVENT_INIT (event);
else if (EQ (symb, Qt) || EQ (symb, Qall_events))
return IN_ALL_EVENTS;
else
- xsignal2 (Qfile_notify_error, build_string ("Unknown aspect"), symb);
+ {
+ errno = EINVAL;
+ report_file_notify_error ("Unknown aspect", symb);
+ }
}
static uint32_t
{
inotifyfd = inotify_init1 (IN_NONBLOCK|IN_CLOEXEC);
if (inotifyfd < 0)
- xsignal1
- (Qfile_notify_error,
- build_string ("File watching feature (inotify) is not available"));
+ report_file_notify_error ("File watching is not available", Qnil);
watch_list = Qnil;
add_read_fd (inotifyfd, &inotify_callback, NULL);
}
encoded_file_name = ENCODE_FILE (file_name);
watchdesc = inotify_add_watch (inotifyfd, SSDATA (encoded_file_name), mask);
if (watchdesc == -1)
- xsignal2 (Qfile_notify_error,
- build_string ("Could not add watch for file"), file_name);
+ report_file_notify_error ("Could not add watch for file", file_name);
watch_descriptor = make_watch_descriptor (watchdesc);
- /* Delete existing watch object. */
+ /* Delete existing watch object. */
watch_object = Fassoc (watch_descriptor, watch_list);
if (!NILP (watch_object))
watch_list = Fdelete (watch_object, watch_list);
- /* Store watch object in watch list. */
+ /* Store watch object in watch list. */
watch_object = Fcons (watch_descriptor, callback);
watch_list = Fcons (watch_object, watch_list);
int wd = XINT (watch_descriptor);
if (inotify_rm_watch (inotifyfd, wd) == -1)
- xsignal2 (Qfile_notify_error,
- build_string ("Could not rm watch"), watch_descriptor);
+ report_file_notify_error ("Could not rm watch", watch_descriptor);
- /* Remove watch descriptor from watch list. */
+ /* Remove watch descriptor from watch list. */
watch_object = Fassoc (watch_descriptor, watch_list);
if (!NILP (watch_object))
watch_list = Fdelete (watch_object, watch_list);
- /* Cleanup if no more files are watched. */
+ /* Cleanup if no more files are watched. */
if (NILP (watch_list))
{
emacs_close (inotifyfd);
return Qt;
}
+DEFUN ("inotify-valid-p", Finotify_valid_p, Sinotify_valid_p, 1, 1, 0,
+ doc: /* "Check a watch specified by its WATCH-DESCRIPTOR.
+
+WATCH-DESCRIPTOR should be an object returned by `inotify-add-watch'.
+
+A watch can become invalid if the file or directory it watches is
+deleted, or if the watcher thread exits abnormally for any other
+reason. Removing the watch by calling `inotify-rm-watch' also makes
+it invalid. */)
+ (Lisp_Object watch_descriptor)
+{
+ Lisp_Object watch_object = Fassoc (watch_descriptor, watch_list);
+ return NILP (watch_object) ? Qnil : Qt;
+}
+
void
syms_of_inotify (void)
{
defsubr (&Sinotify_add_watch);
defsubr (&Sinotify_rm_watch);
+ defsubr (&Sinotify_valid_p);
staticpro (&watch_list);