(dns-read-string-name, dns-read, dns-read-type, query-dns):

Use set-buffer-multibyte rather than set default-enable-multibyte-characters.
This commit is contained in:
Stefan Monnier 2008-03-12 20:52:31 +00:00
parent 5d2e28bfb4
commit eb21f2ff51
2 changed files with 148 additions and 147 deletions

View file

@ -1,5 +1,6 @@
2008-03-12 Stefan Monnier <monnier@iro.umontreal.ca>
* net/dns.el (dns-read-string-name, dns-read, dns-read-type, query-dns):
* sha1.el (sha1-string-external): Use set-buffer-multibyte rather than
setting default-enable-multibyte-characters.

View file

@ -102,11 +102,11 @@ If nil, /etc/resolv.conf will be consulted.")
(dns-write-bytes 0))
(defun dns-read-string-name (string buffer)
(let (default-enable-multibyte-characters)
(with-temp-buffer
(insert string)
(goto-char (point-min))
(dns-read-name buffer))))
(with-temp-buffer
(set-buffer-multibyte nil)
(insert string)
(goto-char (point-min))
(dns-read-name buffer)))
(defun dns-read-name (&optional buffer)
(let ((ended nil)
@ -186,72 +186,72 @@ If TCP-P, the first two bytes of the package with be the length field."
(buffer-string)))
(defun dns-read (packet)
(let (default-enable-multibyte-characters)
(with-temp-buffer
(let ((spec nil)
queries answers authorities additionals)
(insert packet)
(goto-char (point-min))
(push (list 'id (dns-read-bytes 2)) spec)
(let ((byte (dns-read-bytes 1)))
(push (list 'response-p (if (zerop (logand byte (lsh 1 7))) nil t))
spec)
(let ((opcode (logand byte (lsh 7 3))))
(push (list 'opcode
(cond ((eq opcode 0) 'query)
((eq opcode 1) 'inverse-query)
((eq opcode 2) 'status)))
spec))
(push (list 'authoritative-p (if (zerop (logand byte (lsh 1 2)))
nil t)) spec)
(push (list 'truncated-p (if (zerop (logand byte (lsh 1 2))) nil t))
spec)
(push (list 'recursion-desired-p
(if (zerop (logand byte (lsh 1 0))) nil t)) spec))
(let ((rc (logand (dns-read-bytes 1) 15)))
(push (list 'response-code
(cond
((eq rc 0) 'no-error)
((eq rc 1) 'format-error)
((eq rc 2) 'server-failure)
((eq rc 3) 'name-error)
((eq rc 4) 'not-implemented)
((eq rc 5) 'refused)))
(with-temp-buffer
(set-buffer-multibyte nil)
(let ((spec nil)
queries answers authorities additionals)
(insert packet)
(goto-char (point-min))
(push (list 'id (dns-read-bytes 2)) spec)
(let ((byte (dns-read-bytes 1)))
(push (list 'response-p (if (zerop (logand byte (lsh 1 7))) nil t))
spec)
(let ((opcode (logand byte (lsh 7 3))))
(push (list 'opcode
(cond ((eq opcode 0) 'query)
((eq opcode 1) 'inverse-query)
((eq opcode 2) 'status)))
spec))
(setq queries (dns-read-bytes 2))
(setq answers (dns-read-bytes 2))
(setq authorities (dns-read-bytes 2))
(setq additionals (dns-read-bytes 2))
(let ((qs nil))
(dotimes (i queries)
(push (list 'authoritative-p (if (zerop (logand byte (lsh 1 2)))
nil t)) spec)
(push (list 'truncated-p (if (zerop (logand byte (lsh 1 2))) nil t))
spec)
(push (list 'recursion-desired-p
(if (zerop (logand byte (lsh 1 0))) nil t)) spec))
(let ((rc (logand (dns-read-bytes 1) 15)))
(push (list 'response-code
(cond
((eq rc 0) 'no-error)
((eq rc 1) 'format-error)
((eq rc 2) 'server-failure)
((eq rc 3) 'name-error)
((eq rc 4) 'not-implemented)
((eq rc 5) 'refused)))
spec))
(setq queries (dns-read-bytes 2))
(setq answers (dns-read-bytes 2))
(setq authorities (dns-read-bytes 2))
(setq additionals (dns-read-bytes 2))
(let ((qs nil))
(dotimes (i queries)
(push (list (dns-read-name)
(list 'type (dns-inverse-get (dns-read-bytes 2)
dns-query-types))
(list 'class (dns-inverse-get (dns-read-bytes 2)
dns-classes)))
qs))
(push (list 'queries qs) spec))
(dolist (slot '(answers authorities additionals))
(let ((qs nil)
type)
(dotimes (i (symbol-value slot))
(push (list (dns-read-name)
(list 'type (dns-inverse-get (dns-read-bytes 2)
dns-query-types))
(list 'type
(setq type (dns-inverse-get (dns-read-bytes 2)
dns-query-types)))
(list 'class (dns-inverse-get (dns-read-bytes 2)
dns-classes)))
dns-classes))
(list 'ttl (dns-read-bytes 4))
(let ((length (dns-read-bytes 2)))
(list 'data
(dns-read-type
(buffer-substring
(point)
(progn (forward-char length) (point)))
type))))
qs))
(push (list 'queries qs) spec))
(dolist (slot '(answers authorities additionals))
(let ((qs nil)
type)
(dotimes (i (symbol-value slot))
(push (list (dns-read-name)
(list 'type
(setq type (dns-inverse-get (dns-read-bytes 2)
dns-query-types)))
(list 'class (dns-inverse-get (dns-read-bytes 2)
dns-classes))
(list 'ttl (dns-read-bytes 4))
(let ((length (dns-read-bytes 2)))
(list 'data
(dns-read-type
(buffer-substring
(point)
(progn (forward-char length) (point)))
type))))
qs))
(push (list slot qs) spec)))
(nreverse spec)))))
(push (list slot qs) spec)))
(nreverse spec))))
(defun dns-read-int32 ()
;; Full 32 bit Integers can't be handled by Emacs. If we use
@ -263,40 +263,40 @@ If TCP-P, the first two bytes of the package with be the length field."
(let ((buffer (current-buffer))
(point (point)))
(prog1
(let (default-enable-multibyte-characters)
(with-temp-buffer
(insert string)
(goto-char (point-min))
(cond
((eq type 'A)
(let ((bytes nil))
(dotimes (i 4)
(push (dns-read-bytes 1) bytes))
(mapconcat 'number-to-string (nreverse bytes) ".")))
((eq type 'AAAA)
(let (hextets)
(dotimes (i 8)
(push (dns-read-bytes 2) hextets))
(mapconcat (lambda (n) (format "%x" n))
(nreverse hextets) ":")))
((eq type 'SOA)
(list (list 'mname (dns-read-name buffer))
(list 'rname (dns-read-name buffer))
(list 'serial (dns-read-int32))
(list 'refresh (dns-read-int32))
(list 'retry (dns-read-int32))
(list 'expire (dns-read-int32))
(list 'minimum (dns-read-int32))))
((eq type 'SRV)
(list (list 'priority (dns-read-bytes 2))
(list 'weight (dns-read-bytes 2))
(list 'port (dns-read-bytes 2))
(list 'target (dns-read-name buffer))))
((eq type 'MX)
(cons (dns-read-bytes 2) (dns-read-name buffer)))
((or (eq type 'CNAME) (eq type 'NS) (eq type 'PTR))
(dns-read-string-name string buffer))
(t string))))
(with-temp-buffer
(set-buffer-multibyte nil)
(insert string)
(goto-char (point-min))
(cond
((eq type 'A)
(let ((bytes nil))
(dotimes (i 4)
(push (dns-read-bytes 1) bytes))
(mapconcat 'number-to-string (nreverse bytes) ".")))
((eq type 'AAAA)
(let (hextets)
(dotimes (i 8)
(push (dns-read-bytes 2) hextets))
(mapconcat (lambda (n) (format "%x" n))
(nreverse hextets) ":")))
((eq type 'SOA)
(list (list 'mname (dns-read-name buffer))
(list 'rname (dns-read-name buffer))
(list 'serial (dns-read-int32))
(list 'refresh (dns-read-int32))
(list 'retry (dns-read-int32))
(list 'expire (dns-read-int32))
(list 'minimum (dns-read-int32))))
((eq type 'SRV)
(list (list 'priority (dns-read-bytes 2))
(list 'weight (dns-read-bytes 2))
(list 'port (dns-read-bytes 2))
(list 'target (dns-read-name buffer))))
((eq type 'MX)
(cons (dns-read-bytes 2) (dns-read-name buffer)))
((or (eq type 'CNAME) (eq type 'NS) (eq type 'PTR))
(dns-read-string-name string buffer))
(t string)))
(goto-char point))))
(defun dns-parse-resolv-conf ()
@ -378,53 +378,53 @@ If REVERSEP, look up an IP address."
(if (not dns-servers)
(message "No DNS server configuration found")
(let (default-enable-multibyte-characters)
(with-temp-buffer
(let ((process (condition-case ()
(dns-make-network-process (car dns-servers))
(error
(message
"dns: Got an error while trying to talk to %s"
(car dns-servers))
nil)))
(tcp-p (and (not (fboundp 'make-network-process))
(not (featurep 'xemacs))))
(step 100)
(times (* dns-timeout 1000))
(id (random 65000)))
(when process
(process-send-string
process
(dns-write `((id ,id)
(opcode query)
(queries ((,name (type ,type))))
(recursion-desired-p t))
tcp-p))
(while (and (zerop (buffer-size))
(> times 0))
(sit-for (/ step 1000.0))
(accept-process-output process 0 step)
(setq times (- times step)))
(condition-case nil
(delete-process process)
(error nil))
(when (and tcp-p
(>= (buffer-size) 2))
(goto-char (point-min))
(delete-region (point) (+ (point) 2)))
(when (and (>= (buffer-size) 2)
;; We had a time-out.
(> times 0))
(let ((result (dns-read (buffer-string))))
(if fullp
result
(let ((answer (car (dns-get 'answers result))))
(when (eq type (dns-get 'type answer))
(if (eq type 'TXT)
(dns-get-txt-answer (dns-get 'answers result))
(dns-get 'data answer)))))))))))))
(with-temp-buffer
(set-buffer-multibyte nil)
(let ((process (condition-case ()
(dns-make-network-process (car dns-servers))
(error
(message
"dns: Got an error while trying to talk to %s"
(car dns-servers))
nil)))
(tcp-p (and (not (fboundp 'make-network-process))
(not (featurep 'xemacs))))
(step 100)
(times (* dns-timeout 1000))
(id (random 65000)))
(when process
(process-send-string
process
(dns-write `((id ,id)
(opcode query)
(queries ((,name (type ,type))))
(recursion-desired-p t))
tcp-p))
(while (and (zerop (buffer-size))
(> times 0))
(sit-for (/ step 1000.0))
(accept-process-output process 0 step)
(setq times (- times step)))
(condition-case nil
(delete-process process)
(error nil))
(when (and tcp-p
(>= (buffer-size) 2))
(goto-char (point-min))
(delete-region (point) (+ (point) 2)))
(when (and (>= (buffer-size) 2)
;; We had a time-out.
(> times 0))
(let ((result (dns-read (buffer-string))))
(if fullp
result
(let ((answer (car (dns-get 'answers result))))
(when (eq type (dns-get 'type answer))
(if (eq type 'TXT)
(dns-get-txt-answer (dns-get 'answers result))
(dns-get 'data answer))))))))))))
(provide 'dns)
;;; arch-tag: d0edd0c4-4cce-4538-ae92-06c3356ee80a
;; arch-tag: d0edd0c4-4cce-4538-ae92-06c3356ee80a
;;; dns.el ends here