Place CNAMEs first in each section.

This commit is contained in:
Tony Garnock-Jones 2011-12-21 17:48:15 -05:00
parent faaa81b310
commit 8c09bafdd4
3 changed files with 19 additions and 11 deletions

View File

@ -48,12 +48,12 @@
'name-error
'no-error)
(dns-message-questions r1)
(listset-union (dns-message-answers r1) (dns-message-answers r2))
(listset-union (dns-message-authorities r1) (dns-message-authorities r2))
(listset-union (dns-message-additional r1) (dns-message-additional r2))))
(rr-listset-union (dns-message-answers r1) (dns-message-answers r2))
(rr-listset-union (dns-message-authorities r1) (dns-message-authorities r2))
(rr-listset-union (dns-message-additional r1) (dns-message-additional r2))))
(define (listset-union xs1 xs2)
(set->list (set-union (list->set xs1) (list->set xs2))))
(define (rr-listset-union xs1 xs2)
(rr-set->list (set-union (list->set xs1) (list->set xs2))))
;; start-server : UInt16 RR ListOf<RR> -> Void
;; Starts a server that will answer questions received on the given
@ -121,9 +121,9 @@
'no-recursion-available
(if send-name-error? 'name-error 'no-error)
(dns-message-questions request-message)
(set->list answers)
(set->list authorities)
(set->list additional)))
(rr-set->list answers)
(rr-set->list authorities)
(rr-set->list additional)))
(define reply-packet
(with-handlers ((exn? (lambda (e)

View File

@ -92,9 +92,9 @@
'no-recursion-available
(if send-name-error? 'name-error 'no-error)
(dns-message-questions request-message)
(set->list answers)
(set->list authorities)
(set->list additional)))
(rr-set->list answers)
(rr-set->list authorities)
(rr-set->list additional)))
(define (answer-question q make-reply)
;; Notice that we claim to be authoritative for our configured

View File

@ -14,6 +14,7 @@
referral-for
additional-section/a
filter-rrs
rr-set->list
resolve)
@ -105,6 +106,13 @@
(else (set-filter (lambda (rr) (eqv? (rr-class rr) qclass)) filtered-by-type))))
filtered-by-type-and-class)
;; rr-set->list : SetOf<RR> -> ListOf<RR>
;; Like set->list, but places all CNAME records first.
;; This is apparently to work around bugs in old versions of BIND?
(define (rr-set->list rrs)
(append (set->list (filter-by-type rrs 'cname))
(set->list (set-filter (lambda (rr) (not (eqv? (rr-type rr) 'cname))) rrs))))
;; QuestionResult Maybe<QuestionResult> -> QuestionResult
;; Add the supporting facts from r2 into r1, keeping r1's
;; question. Replaces the knowledge from r1 with the knowledge from