+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).
#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;
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,
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
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
/* 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
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",
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. */
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));
}
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);
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
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
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.
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);
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);
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);
/* 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;