+;;;--------------------------------------------------------------------------
+;;; Anycast services.
+
+(defvar *anycast-routable-families* (list :ipv6))
+
+(defzoneparse :anycast (name data rec :prefix prefix :zname zname)
+ (destructuring-bind (any-provider default-provider &rest other-providers)
+ data
+
+ ;; First, the default address. If the anycast network is preferred then
+ ;; this is easy; otherwise we have something complicated to do because
+ ;; IPv6 anycast addresses are globally routable, while IPv4 ones aren't.
+ (if (zone-preferred-subnet-p (car any-provider))
+ (zone-set-address #'rec (cdr any-provider) :make-ptr-p t)
+ (do-host (addr (cdr any-provider))
+ (let ((family (ipaddr-family addr)))
+ (if (member family *anycast-routable-families*)
+ (zone-set-address #'rec addr
+ :family family :make-ptr-p t)
+ (zone-set-address #'rec (cdr default-provider)
+ :family family :make-ptr-p nil)))))
+
+ ;; Now for all of the others.
+ (dolist (provider (list* any-provider default-provider other-providers))
+ (zone-set-address #'rec (cdr provider)
+ :make-ptr-p (eq provider any-provider)
+ :name (domain-name-concat prefix
+ (zone-parse-host
+ (car provider)
+ zname))))))
+
+;;;--------------------------------------------------------------------------
+;;; Hostname abbreviations.
+
+(defvar *abbrev-subdomain*
+ (make-domain-name :labels '("abbrev") :absolutep nil))
+(defparameter *abbrev-used* (make-hash-table :test #'equal))
+
+(defzoneparse :abbrev (name data rec :zname zname)
+ (let* ((domain (zone-parse-host data
+ (domain-name-concat *abbrev-subdomain*
+ zname)))
+ (key (princ-to-string domain))
+ (existing (gethash key *abbrev-used*)))
+ (when existing
+ (error "Abbrev collision for ~A between ~A and ~A."
+ domain existing name))
+ (setf (gethash key *abbrev-used*) name)
+ (rec :name domain
+ :type :cname
+ :data name)))
+