X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fdns.el;h=ea1c805c6b9f10b2466b1eb7fba28bd00d6e470d;hb=99648d27eedbdead431411bfa31edd18c4ad5db4;hp=00e48c6480f84fb9f7bfd25c131336bc0fc63df2;hpb=8b5af94e55ef83ee46b42d32d92fa1ce95dcacf5;p=gnus diff --git a/lisp/dns.el b/lisp/dns.el index 00e48c648..ea1c805c6 100644 --- a/lisp/dns.el +++ b/lisp/dns.el @@ -1,10 +1,9 @@ ;;; dns.el --- Domain Name Service lookups -;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 -;; Free Software Foundation, Inc. +;; Copyright (C) 2002-2014 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen -;; Keywords: network +;; Keywords: network comm ;; This file is part of GNU Emacs. @@ -29,8 +28,14 @@ "How many seconds to wait when doing DNS queries.") (defvar dns-servers nil - "Which DNS servers to query. -If nil, /etc/resolv.conf will be consulted.") + "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: @@ -101,7 +106,7 @@ If nil, /etc/resolv.conf will be consulted.") (defun dns-read-string-name (string buffer) (with-temp-buffer - (set-buffer-multibyte nil) + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) (insert string) (goto-char (point-min)) (dns-read-name buffer))) @@ -135,7 +140,7 @@ If nil, /etc/resolv.conf will be consulted.") "Write a DNS packet according to SPEC. If TCP-P, the first two bytes of the package with be the length field." (with-temp-buffer - (set-buffer-multibyte nil) + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) (dns-write-bytes (dns-get 'id spec) 2) (dns-write-bytes (logior @@ -151,7 +156,7 @@ If TCP-P, the first two bytes of the package with be the length field." (lsh (if (dns-get 'truncated-p spec) 1 0) -1) (lsh (if (dns-get 'recursion-desired-p spec) 1 0) 0))) (dns-write-bytes - (cond + (cond ((eq (dns-get 'response-code spec) 'no-error) 0) ((eq (dns-get 'response-code spec) 'format-error) 1) ((eq (dns-get 'response-code spec) 'server-failure) 2) @@ -186,7 +191,7 @@ If TCP-P, the first two bytes of the package with be the length field." (defun dns-read (packet) (with-temp-buffer - (set-buffer-multibyte nil) + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) (let ((spec nil) queries answers authorities additionals) (insert packet) @@ -253,8 +258,8 @@ If TCP-P, the first two bytes of the package with be the length field." (nreverse spec)))) (defun dns-read-int32 () - ;; Full 32 bit Integers can't be handled by Emacs. If we use - ;; floats, it works. + ;; Full 32 bit Integers can't be handled by 32-bit Emacsen. If we + ;; use floats, it works. (format "%.0f" (+ (* (dns-read-bytes 1) 16777216.0) (dns-read-bytes 3)))) @@ -263,7 +268,7 @@ If TCP-P, the first two bytes of the package with be the length field." (point (point))) (prog1 (with-temp-buffer - (set-buffer-multibyte nil) + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) (insert string) (goto-char (point-min)) (cond @@ -298,14 +303,37 @@ If TCP-P, the first two bytes of the package with be the length field." (t string))) (goto-char point)))) -(defun dns-parse-resolv-conf () - (when (file-exists-p "/etc/resolv.conf") - (with-temp-buffer - (insert-file-contents "/etc/resolv.conf") - (goto-char (point-min)) - (while (re-search-forward "^nameserver[\t ]+\\([^ \t\n]+\\)" nil t) - (push (match-string 1) dns-servers)) - (setq dns-servers (nreverse dns-servers))))) +(declare-function network-interface-list "process.c") + +(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\"." + (or (when (file-exists-p "/etc/resolv.conf") + (setq dns-servers nil) + (with-temp-buffer + (insert-file-contents "/etc/resolv.conf") + (goto-char (point-min)) + (while (re-search-forward "^nameserver[\t ]+\\([^ \t\n]+\\)" nil t) + (push (match-string 1) dns-servers)) + (setq dns-servers (nreverse dns-servers)))) + (when (executable-find "nslookup") + (with-temp-buffer + (call-process "nslookup" nil t nil "localhost") + (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)))))) + (when (fboundp 'network-interface-list) + (setq dns-servers-valid-for-interfaces (network-interface-list)))) (defun dns-read-txt (string) (if (> (length string) 1) @@ -351,23 +379,26 @@ If TCP-P, the first two bytes of the package with be the length field." (defvar dns-cache (make-vector 4096 0)) -(defun query-dns-cached (name &optional type fullp reversep) +(defun dns-query-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))) + (let ((result (dns-query name type fullp reversep))) (set (intern key dns-cache) result) result)))) -(defun query-dns (name &optional type fullp reversep) +;; The old names `query-dns' and `query-dns-cached' weren't used in Emacs 23 +;; yet, so no alias are provided. --rsteib + +(defun dns-query (name &optional type fullp reversep) "Query a DNS server for NAME of TYPE. 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)) + (unless (dns-servers-up-to-date-p) + (dns-set-servers)) (when reversep (setq name (concat @@ -378,7 +409,7 @@ If REVERSEP, look up an IP address." (if (not dns-servers) (message "No DNS server configuration found") (with-temp-buffer - (set-buffer-multibyte nil) + (unless (featurep 'xemacs) (set-buffer-multibyte nil)) (let ((process (condition-case () (dns-make-network-process (car dns-servers)) (error @@ -425,5 +456,4 @@ If REVERSEP, look up an IP address." (provide 'dns) -;; arch-tag: d0edd0c4-4cce-4538-ae92-06c3356ee80a ;;; dns.el ends here