Synch to No Gnus 200506260145.
[elisp/gnus.git-] / lisp / dns.el
index bddfe02..a243e6c 100644 (file)
@@ -350,13 +350,32 @@ If TCP-P, the first two bytes of the package with be the length field."
         ;; connection to the DNS server.
         (open-network-stream "dns" (current-buffer) server "domain")))))
 
-(defun query-dns (name &optional type fullp)
+(defvar dns-cache (make-vector 4096 0))
+
+(defun query-dns-cached (name &optional type fullp reversep)
+  (let* ((key (format "%s:%s:%s:%s" name type fullp reversep))
+        (sym (intern-soft key dns-cache)))
+    (if (and sym
+            (boundp sym))
+       (symbol-value sym)
+      (let ((result (query-dns name type fullp reversep)))
+       (set (intern key dns-cache) result)
+       result))))
+
+(defun query-dns (name &optional type fullp reversep)
   "Query a DNS server for NAME of TYPE.
-If FULLP, return the entire record returned."
+If FULLP, return the entire record returned.
+If REVERSEP, look up an IP address."
   (setq type (or type 'A))
   (unless dns-servers
     (dns-parse-resolv-conf))
 
+  (when reversep
+    (setq name (concat
+               (mapconcat 'identity (nreverse (split-string name "\\.")) ".")
+               ".in-addr.arpa")
+         type 'PTR))
+
   (if (not dns-servers)
       (message "No DNS server configuration found")
     (mm-with-unibyte-buffer
@@ -381,6 +400,7 @@ If FULLP, return the entire record returned."
                      tcp-p))
          (while (and (zerop (buffer-size))
                      (> times 0))
+           (sit-for (/ step 1000.0))
            (accept-process-output process 0 step)
            (decf times step))
          (ignore-errors