* url-handlers.el (url-file-handler-load-in-progress): New defvar.
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 9 May 2014 12:49:30 +0000 (14:49 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Fri, 9 May 2014 12:49:30 +0000 (14:49 +0200)
(url-file-handler): Use it, in order to avoid recursive load.

lisp/url/ChangeLog
lisp/url/url-handlers.el

index da7d732..408f659 100644 (file)
@@ -1,3 +1,8 @@
+2014-05-09  Michael Albinus  <michael.albinus@gmx.de>
+
+       * url-handlers.el (url-file-handler-load-in-progress): New defvar.
+       (url-file-handler): Use it, in order to avoid recursive load.
+
 2014-05-01  Glenn Morris  <rgm@gnu.org>
 
        * url-parse.el (url-generic-parse-url): Doc fix (replace `iff').
index ecf56e7..b0f0112 100644 (file)
@@ -137,25 +137,32 @@ like URLs \(Gnus is particularly bad at this\)."
        (inhibit-file-name-operation operation))
     (apply operation args)))
 
+(defvar url-file-handler-load-in-progress nil
+  "Check for recursive load.")
+
 ;;;###autoload
 (defun url-file-handler (operation &rest args)
   "Function called from the `file-name-handler-alist' routines.
 OPERATION is what needs to be done (`file-exists-p', etc).  ARGS are
 the arguments that would have been passed to OPERATION."
-  (let ((fn (get operation 'url-file-handlers))
-       (val nil)
-       (hooked nil))
-    (if (and (not fn) (intern-soft (format "url-%s" operation))
-             (fboundp (intern-soft (format "url-%s" operation))))
-        (error "Missing URL handler mapping for %s" operation))
-    (if fn
-       (setq hooked t
-             val (save-match-data (apply fn args)))
-      (setq hooked nil
-           val (url-run-real-handler operation args)))
-    (url-debug 'handlers "%s %S%S => %S" (if hooked "Hooked" "Real")
-              operation args val)
-    val))
+  ;; Avoid recursive load.
+  (if (and load-in-progress url-file-handler-load-in-progress)
+      (url-run-real-handler operation args)
+    (let ((url-file-handler-load-in-progress load-in-progress)
+         (fn (get operation 'url-file-handlers))
+         (val nil)
+         (hooked nil))
+      (if (and (not fn) (intern-soft (format "url-%s" operation))
+              (fboundp (intern-soft (format "url-%s" operation))))
+         (error "Missing URL handler mapping for %s" operation))
+      (if fn
+         (setq hooked t
+               val (save-match-data (apply fn args)))
+       (setq hooked nil
+             val (url-run-real-handler operation args)))
+      (url-debug 'handlers "%s %S%S => %S" (if hooked "Hooked" "Real")
+                operation args val)
+      val)))
 
 (defun url-file-handler-identity (&rest args)
   ;; Identity function