* fileio.c (Qfile_notify_error): New error symbol.
authorMichael Albinus <michael.albinus@gmx.de>
Thu, 4 Jul 2013 09:29:28 +0000 (11:29 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Thu, 4 Jul 2013 09:29:28 +0000 (11:29 +0200)
* 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.

src/ChangeLog
src/fileio.c
src/gfilenotify.c
src/inotify.c
src/lisp.h

index 1bd5357..416e60f 100644 (file)
@@ -1,3 +1,15 @@
+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).
index 4a14f5a..3bfea20 100644 (file)
@@ -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
index c8d12ce..4e684d1 100644 (file)
@@ -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. */
index 4efef9e..01fb34a 100644 (file)
@@ -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);
index 74f52b3..5d6fa76 100644 (file)
@@ -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;