Commit 86dfb7a8 authored by Michael Albinus's avatar Michael Albinus
Browse files

* fileio.c (Qfile_notify_error): New error symbol.

* gfilenotify.c (Fgfile_add_watch, Fgfile_rm_watch):
* inotify.c (inotify_callback, symbol_to_inotifymask)
(Finotify_add_watch, Finotify_rm_watch): Use it.
(inotifyevent_to_event): Exchange order of cookie and file name.
(Finotify_add_watch): Adapt docstring.

* lisp.h (Qfile_notify_error): Declare.
parent 2c1c974b
2013-07-04 Michael Albinus <michael.albinus@gmx.de>
* fileio.c (Qfile_notify_error): New error symbol.
* gfilenotify.c (Fgfile_add_watch, Fgfile_rm_watch):
* inotify.c (inotify_callback, symbol_to_inotifymask)
(Finotify_add_watch, Finotify_rm_watch): Use it.
(inotifyevent_to_event): Exchange order of cookie and file name.
(Finotify_add_watch): Adapt docstring.
* lisp.h (Qfile_notify_error): Declare.
2013-07-04 Paul Eggert <eggert@cs.ucla.edu>
Try again to fix FreeBSD bug re multithreaded memory alloc (Bug#14569).
......
......@@ -148,7 +148,7 @@ static Lisp_Object Qdelete_directory;
#ifdef WINDOWSNT
#endif
Lisp_Object Qfile_error;
Lisp_Object Qfile_error, Qfile_notify_error;
static Lisp_Object Qfile_already_exists, Qfile_date_error;
static Lisp_Object Qexcl;
Lisp_Object Qfile_name_history;
......@@ -5887,6 +5887,7 @@ syms_of_fileio (void)
DEFSYM (Qfile_error, "file-error");
DEFSYM (Qfile_already_exists, "file-already-exists");
DEFSYM (Qfile_date_error, "file-date-error");
DEFSYM (Qfile_notify_error, "file-notify-error");
DEFSYM (Qexcl, "excl");
DEFVAR_LISP ("file-name-coding-system", Vfile_name_coding_system,
......@@ -5925,6 +5926,11 @@ of file names regardless of the current language environment. */);
Fput (Qfile_date_error, Qerror_message,
build_pure_c_string ("Cannot set file date"));
Fput (Qfile_notify_error, Qerror_conditions,
Fpurecopy (list3 (Qfile_notify_error, Qfile_error, Qerror)));
Fput (Qfile_notify_error, Qerror_message,
build_pure_c_string ("File notification error"));
DEFVAR_LISP ("file-name-handler-alist", Vfile_name_handler_alist,
doc: /* Alist of elements (REGEXP . HANDLER) for file names handled specially.
If a file name matches REGEXP, all I/O on that file is done by calling
......
......@@ -132,15 +132,14 @@ This arranges for filesystem events pertaining to FILE to be reported
to Emacs. Use `gfile-rm-watch' to cancel the watch.
Value is a descriptor for the added watch. If the file cannot be
watched for some reason, this function signals a `file-error' error.
watched for some reason, this function signals a `file-notify-error' error.
FLAGS is a list of conditions to set what will be watched for. It can
include the following symbols:
'watch-mounts' -- watch for mount events
'send-moved' -- pair 'deleted' and 'created' events caused by file
renames (moves) and send a single 'event-moved'
event instead
renames and send a single 'renamed' event instead
When any event happens, Emacs will call the CALLBACK function passing
it a single argument EVENT, which is of the form
......@@ -193,7 +192,7 @@ will be reported only in case of the 'moved' event. */)
/* Enable watch. */
monitor = g_file_monitor (gfile, gflags, NULL, NULL);
if (! monitor)
xsignal2 (Qfile_error, build_string ("Cannot watch file"), file);
xsignal2 (Qfile_notify_error, build_string ("Cannot watch file"), file);
/* On all known glib platforms, converting MONITOR directly to a
Lisp_Object value results is a Lisp integer, which is safe. This
......@@ -202,7 +201,8 @@ will be reported only in case of the 'moved' event. */)
if (! INTEGERP (watch_descriptor))
{
g_object_unref (monitor);
xsignal2 (Qfile_error, build_string ("Unsupported file watcher"), file);
xsignal2 (Qfile_notify_error, build_string ("Unsupported file watcher"),
file);
}
g_signal_connect (monitor, "changed",
......@@ -226,14 +226,14 @@ WATCH-DESCRIPTOR should be an object returned by `gfile-add-watch'. */)
Lisp_Object watch_object = assq_no_quit (watch_descriptor, watch_list);
if (! CONSP (watch_object))
xsignal2 (Qfile_error, build_string ("Not a watch descriptor"),
xsignal2 (Qfile_notify_error, build_string ("Not a watch descriptor"),
watch_descriptor);
eassert (INTEGERP (watch_descriptor));
int_monitor = XLI (watch_descriptor);
monitor = (GFileMonitor *) int_monitor;
if (!g_file_monitor_cancel (monitor))
xsignal2 (Qfile_error, build_string ("Could not rm watch"),
xsignal2 (Qfile_notify_error, build_string ("Could not rm watch"),
watch_descriptor);
/* Remove watch descriptor from watch list. */
......
......@@ -139,8 +139,8 @@ inotifyevent_to_event (Lisp_Object watch_object, struct inotify_event const *ev)
return list2 (list4 (make_watch_descriptor (ev->wd),
mask_to_aspects (ev->mask),
make_number (ev->cookie),
name),
name,
make_number (ev->cookie)),
XCDR (watch_object));
}
......@@ -158,15 +158,17 @@ inotify_callback (int fd, void *_)
to_read = 0;
if (ioctl (fd, FIONREAD, &to_read) == -1)
report_file_error ("Error while trying to retrieve file system events",
Qnil);
xsignal1
(Qfile_notify_error,
build_string ("Error while trying to retrieve file system events"));
buffer = xmalloc (to_read);
n = read (fd, buffer, to_read);
if (n < 0)
{
xfree (buffer);
report_file_error ("Error while trying to read file system events",
Qnil);
xsignal1
(Qfile_notify_error,
build_string ("Error while trying to read file system events"));
}
EVENT_INIT (event);
......@@ -242,7 +244,7 @@ symbol_to_inotifymask (Lisp_Object symb)
else if (EQ (symb, Qt) || EQ (symb, Qall_events))
return IN_ALL_EVENTS;
else
signal_error ("Unknown aspect", symb);
xsignal2 (Qfile_notify_error, build_string ("Unknown aspect"), symb);
}
static uint32_t
......@@ -298,7 +300,7 @@ Watching a directory is not recursive. CALLBACK gets called in case of an
event. It gets passed a single argument EVENT which contains an event structure
of the format
(WATCH-DESCRIPTOR ASPECTS COOKIE NAME)
(WATCH-DESCRIPTOR ASPECTS NAME COOKIE)
WATCH-DESCRIPTOR is the same object that was returned by this function. It can
be tested for equality using `equal'. ASPECTS describes the event. It is a
......@@ -310,11 +312,11 @@ isdir
q-overflow
unmount
If a directory is watched then NAME is the name of file that caused the event.
COOKIE is an object that can be compared using `equal' to identify two matching
renames (moved-from and moved-to).
If a directory is watched then NAME is the name of file that caused the event.
See inotify(7) and inotify_add_watch(2) for further information. The inotify fd
is managed internally and there is no corresponding inotify_init. Use
`inotify-rm-watch' to remove a watch.
......@@ -335,8 +337,9 @@ is managed internally and there is no corresponding inotify_init. Use
if (inotifyfd == -1)
{
inotifyfd = uninitialized;
report_file_error ("File watching feature (inotify) is not available",
Qnil);
xsignal1
(Qfile_notify_error,
build_string ("File watching feature (inotify) is not available"));
}
watch_list = Qnil;
add_read_fd (inotifyfd, &inotify_callback, NULL);
......@@ -346,7 +349,8 @@ is managed internally and there is no corresponding inotify_init. Use
encoded_file_name = ENCODE_FILE (file_name);
watchdesc = inotify_add_watch (inotifyfd, SSDATA (encoded_file_name), mask);
if (watchdesc == -1)
report_file_error ("Could not add watch for file", Fcons (file_name, Qnil));
xsignal2 (Qfile_notify_error,
build_string ("Could not add watch for file"), file_name);
watch_descriptor = make_watch_descriptor (watchdesc);
......@@ -375,8 +379,8 @@ See inotify_rm_watch(2) for more information.
int wd = XINT (watch_descriptor);
if (inotify_rm_watch (inotifyfd, wd) == -1)
report_file_error ("Could not rm watch", Fcons (watch_descriptor,
Qnil));
xsignal2 (Qfile_notify_error,
build_string ("Could not rm watch"), watch_descriptor);
/* Remove watch descriptor from watch list. */
watch_object = Fassoc (watch_descriptor, watch_list);
......
......@@ -3809,6 +3809,7 @@ extern void syms_of_marker (void);
/* Defined in fileio.c. */
extern Lisp_Object Qfile_error;
extern Lisp_Object Qfile_notify_error;
extern Lisp_Object Qfile_exists_p;
extern Lisp_Object Qfile_directory_p;
extern Lisp_Object Qinsert_file_contents;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment