(push (match-string 1) dns-servers))
(setq dns-servers (nreverse dns-servers)))))
+(defun dns-read-txt (string)
+ (if (> (length string) 1)
+ (substring string 1)
+ string))
+
+(defun dns-get-txt-answer (answers)
+ (let ((result "")
+ (do-next nil))
+ (dolist (answer answers)
+ (dolist (elem answer)
+ (when (consp elem)
+ (cond
+ ((eq (car elem) 'type)
+ (setq do-next (eq (cadr elem) 'TXT)))
+ ((eq (car elem) 'data)
+ (when do-next
+ (setq result (concat result (dns-read-txt (cadr elem))))))))))
+ result))
+
;;; Interface functions.
(defmacro dns-make-network-process (server)
(if (featurep 'xemacs)
;; connection to the DNS server.
(open-network-stream "dns" (current-buffer) server "domain")))))
-(defun query-dns (name &optional type fullp)
+(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
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
result
(let ((answer (car (dns-get 'answers result))))
(when (eq type (dns-get 'type answer))
- (dns-get 'data answer)))))))))))
+ (if (eq type 'TXT)
+ (dns-get-txt-answer (dns-get 'answers result))
+ (dns-get 'data answer))))))))))))
(provide 'dns)