Flush dns.el data if the network interfaces change
authorMagnus Henoch <magnus.henoch@gmail.com>
Fri, 31 Jan 2014 23:52:02 +0000 (15:52 -0800)
committerLars Ingebrigtsen <larsi@building.gnus.org>
Fri, 31 Jan 2014 23:52:02 +0000 (15:52 -0800)
* dns.el (dns-servers-up-to-date-p): New function to see whether the
network interfaces changed.
(dns-query): Use it to flush the data.

lisp/ChangeLog
lisp/dns.el

index b0814fb..0a6a95b 100644 (file)
@@ -1,3 +1,9 @@
+2014-01-31  Magnus Henoch  <magnus.henoch@gmail.com>
+
+       * dns.el (dns-servers-up-to-date-p): New function to see whether the
+       network interfaces changed.
+       (dns-query): Use it to flush the data.
+
 2013-09-04  Rasmus Pank Roulund  <emacs@pank.eu>
 
        * gnus-fun.el (gnus-x-face-omit-files): Regexp to omit matched results
index e52ead1..1419350 100644 (file)
   "List of DNS servers to query.
 If nil, /etc/resolv.conf and nslookup will be consulted.")
 
+(defvar dns-servers-valid-for-interfaces nil
+  "The return value of `network-interface-list' when `dns-servers' was set.
+If the set of network interfaces and/or their IP addresses
+change, then presumably the list of DNS servers needs to be
+updated.  Set this variable to t to disable the check.")
+
 ;;; Internal code:
 
 (defvar dns-query-types
@@ -297,6 +303,15 @@ If TCP-P, the first two bytes of the package with be the length field."
            (t string)))
       (goto-char point))))
 
+(defun dns-servers-up-to-date-p ()
+  "Return false if we need to recheck the list of DNS servers."
+  (and dns-servers
+       (or (eq dns-servers-valid-for-interfaces t)
+          ;; `network-interface-list' was introduced in Emacs 22.1.
+          (not (fboundp 'network-interface-list))
+          (equal dns-servers-valid-for-interfaces
+                 (network-interface-list)))))
+
 (defun dns-set-servers ()
   "Set `dns-servers' to a list of DNS servers or nil if none are found.
 Parses \"/etc/resolv.conf\" or calls \"nslookup\"."
@@ -314,7 +329,9 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"."
          (goto-char (point-min))
          (re-search-forward
           "^Address:[ \t]*\\([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\\)" nil t)
-         (setq dns-servers (list (match-string 1)))))))
+         (setq dns-servers (list (match-string 1))))))
+  (when (fboundp 'network-interface-list)
+    (setq dns-servers-valid-for-interfaces (network-interface-list))))
 
 (defun dns-read-txt (string)
   (if (> (length string) 1)
@@ -378,7 +395,7 @@ Parses \"/etc/resolv.conf\" or calls \"nslookup\"."
 If FULLP, return the entire record returned.
 If REVERSEP, look up an IP address."
   (setq type (or type 'A))
-  (unless dns-servers
+  (unless (dns-servers-up-to-date-p)
     (dns-set-servers))
 
   (when reversep