(rec :name (zone-parse-host "mask" name)
:type :a
:data (ipnet-mask n))
- (rec :name (zone-parse-host "broadcast" name)
+ (rec :name (zone-parse-host "bcast" name)
:type :a
:data (ipnet-broadcast n)))))
(defzoneparse (:rev :reverse) (name data rec)
- ":reverse ((NET :bytes BYTES) ZONE*)"
+ ":reverse ((NET :bytes BYTES) ZONE*)
+
+ Add a reverse record each host in the ZONEs (or all zones) that lies
+ within NET. The BYTES give the number of prefix labels generated; this
+ defaults to the smallest number of bytes needed to enumerate the net."
(setf data (listify data))
(destructuring-bind (net &key bytes) (listify (car data))
(setf net (zone-parse-net net name))
(setf (gethash name seen) t)))))))))
(defzoneparse (:cidr-delegation :cidr) (name data rec :zname zname)
- ":cidr-delegation ((NET :bytes BYTES) (TARGET-NET [TARGET-ZONE])*)"
+ ":cidr-delegation ((NET :bytes BYTES) ((TARGET-NET*) [TARGET-ZONE])*)
+
+ Insert CNAME records for delegating a portion of the reverse-lookup
+ namespace which doesn't align with an octet boundary.
+
+ The NET specifies the origin network, in which the reverse records
+ naturally lie. The BYTES are the number of labels to supply for each
+ address; the default is the smallest number which suffices to enumerate
+ the entire NET. The TARGET-NETs are subnets of NET which are to be
+ delegated. The TARGET-ZONEs are the zones to which we are delegating
+ authority for the reverse records: the default is to append labels for those
+ octets of the subnet base address which are not the same in all address in
+ the subnet."
(setf data (listify data))
(destructuring-bind (net &key bytes) (listify (car data))
(setf net (zone-parse-net net name))
(unless bytes
(setf bytes (ipnet-changeable-bytes (ipnet-mask net))))
(dolist (map (or (cdr data) (list (list net))))
- (destructuring-bind (tnet &optional tdom) (listify map)
- (setf tnet (zone-parse-net tnet name))
- (unless (ipnet-subnetp net tnet)
- (error "~A is not a subnet of ~A."
- (ipnet-pretty tnet)
- (ipnet-pretty net)))
- (unless tdom
- (with-ipnet (net mask) tnet
- (setf tdom
- (join-strings
- #\.
- (append (reverse (loop
- for i from (1- bytes) downto 0
- until (zerop (logand mask
- (ash #xff
- (* 8 i))))
- collect (ldb (byte 8 (* i 8)) net)))
- (list name))))))
- (setf tdom (string-downcase (stringify tdom)))
- (dotimes (i (ipnet-hosts tnet))
- (unless (zerop i)
- (let* ((addr (ipnet-host tnet i))
- (tail (join-strings #\.
- (loop
- for i from 0 below bytes
- collect
- (logand #xff
- (ash addr (* 8 i)))))))
- (rec :name (format nil "~A.~A" tail name)
- :type :cname
- :data (format nil "~A.~A" tail tdom)))))))))
+ (destructuring-bind (tnets &optional tdom) (listify map)
+ (dolist (tnet (listify tnets))
+ (setf tnet (zone-parse-net tnet name))
+ (unless (ipnet-subnetp net tnet)
+ (error "~A is not a subnet of ~A."
+ (ipnet-pretty tnet)
+ (ipnet-pretty net)))
+ (unless tdom
+ (with-ipnet (net mask) tnet
+ (setf tdom
+ (join-strings
+ #\.
+ (append (reverse (loop
+ for i from (1- bytes) downto 0
+ until (zerop (logand mask
+ (ash #xff
+ (* 8 i))))
+ collect (ldb (byte 8 (* i 8)) net)))
+ (list name))))))
+ (setf tdom (string-downcase (stringify tdom)))
+ (dotimes (i (ipnet-hosts tnet))
+ (unless (zerop i)
+ (let* ((addr (ipnet-host tnet i))
+ (tail (join-strings #\.
+ (loop
+ for i from 0 below bytes
+ collect
+ (logand #xff
+ (ash addr (* 8 i)))))))
+ (rec :name (format nil "~A.~A" tail name)
+ :type :cname
+ :data (format nil "~A.~A" tail tdom))))))))))
;;;--------------------------------------------------------------------------
;;; Zone file output.