X-Git-Url: https://git.distorted.org.uk/~mdw/zone/blobdiff_plain/2f1d381d7cf464f2ce50d6754a538d9e0fc89876..167608ee8ee54b884d210e6f026a60a415aa313e:/zone.lisp diff --git a/zone.lisp b/zone.lisp index 35e6f80..d3b2c4e 100644 --- a/zone.lisp +++ b/zone.lisp @@ -13,12 +13,12 @@ ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2 of the License, or ;;; (at your option) any later version. -;;; +;;; ;;; This program is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. -;;; +;;; ;;; You should have received a copy of the GNU General Public License ;;; along with this program; if not, write to the Free Software Foundation, ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -33,8 +33,8 @@ #:*default-zone-retry* #:*default-zone-expire* #:*default-zone-min-ttl* #:*default-zone-ttl* #:*default-mx-priority* #:*default-zone-admin* - #:zone-find #:zone-parse #:zone-write #:zone-create #:defzone - #:defrevzone #:zone-save + #:zone-find #:zone-parse #:zone-write #:zone-create #:defzone + #:defrevzone #:zone-save #:defzoneparse #:zone-parse-host #:timespec-seconds #:make-zone-serial)) @@ -144,8 +144,18 @@ ;;;-------------------------------------------------------------------------- ;;; Zone defaults. It is intended that scripts override these. +#+ecl +(cffi:defcfun gethostname :int + (name :pointer) + (len :uint)) + (defvar *default-zone-source* - (let ((hn (unix:unix-gethostname))) + (let ((hn #+cmu (unix:unix-gethostname) + #+clisp (unix:get-host-name) + #+ecl (cffi:with-foreign-pointer-as-string (buffer 256 len) + (let ((rc (gethostname buffer len))) + (unless (zerop rc) + (error "gethostname(2) failed (rc = ~A)." rc)))))) (and hn (concatenate 'string (canonify-hostname hn) "."))) "The default zone source: the current host's name.") @@ -339,44 +349,6 @@ (setf addr (ash addr (* 8 (- 4 n)))) (make-ipnet addr (* 8 n)))) -(defun zone-reverse-records (records net list bytes dom) - "Construct a reverse zone given a forward zone's RECORDS list, the NET that - the reverse zone is to serve, a LIST to collect the records into, how many - BYTES of data need to end up in the zone, and the DOM-ain suffix." - (dolist (zr records) - (when (and (eq (zr-type zr) :a) - (not (zr-defsubp zr)) - (ipaddr-networkp (zr-data zr) net)) - (collect (make-zone-record - :name (string-downcase - (join-strings - #\. - (collecting () - (dotimes (i bytes) - (collect (logand #xff (ash (zr-data zr) - (* -8 i))))) - (collect dom)))) - :type :ptr - :ttl (zr-ttl zr) - :data (zr-name zr)) - list)))) - -(defun zone-reverse (data name list) - "Process a :reverse record's DATA, for a domain called NAME, and add the - records to the LIST." - (destructuring-bind - (net &key bytes zones) - (listify data) - (setf net (zone-parse-net net name)) - (dolist (z (or (listify zones) - (hash-table-keys *zones*))) - (zone-reverse-records (zone-records (zone-find z)) - net - list - (or bytes - (ipnet-changeable-bytes (ipnet-mask net))) - name)))) - (defun zone-parse-net (net name) "Given a NET, and the NAME of a domain to guess from if NET is null, return the ipnet for the network." @@ -412,7 +384,7 @@ (unless (ipnet-subnetp net tnet) (error "~A is not a subnet of ~A." (ipnet-pretty tnet) - (ipnet-pretty net))) + (ipnet-pretty net))) (unless tdom (setf tdom (join-strings #\. @@ -434,7 +406,7 @@ :ttl ttl :data (join-strings #\. (list tail tdom))) list))))))) - + ;;;-------------------------------------------------------------------------- ;;; Zone form parsing. @@ -480,7 +452,7 @@ NAME The name of the record to be added. DATA The content of the record to be added (a single object, - unevaluated). + unevaluated). LIST A function to add a record to the zone. See below. @@ -503,7 +475,7 @@ (setf types (listify types)) (let* ((type (car types)) (func (intern (format nil "ZONE-PARSE/~:@(~A~)" type)))) - (multiple-value-bind (doc decls body) (parse-body body) + (with-parsed-body (body decls doc) body (with-gensyms (col tname ttype tttl tdata tdefsubp i) `(progn (dolist (,i ',types) @@ -552,7 +524,7 @@ (zr-defsubp zr))))) (zone-process-records records (zone-default-ttl zone) - #'parse-record )) + #'parse-record)) (setf (zone-records zone) (nconc (zone-records zone) rec))))) (defun zone-parse (zf) @@ -649,7 +621,7 @@ (rec :name (zone-parse-host "broadcast" name) :type :a :data (ipnet-broadcast n))))) - + (defzoneparse (:rev :reverse) (name data rec) ":reverse ((NET :bytes BYTES) ZONE*)" (setf data (listify data)) @@ -693,7 +665,7 @@ (unless (ipnet-subnetp net tnet) (error "~A is not a subnet of ~A." (ipnet-pretty tnet) - (ipnet-pretty net))) + (ipnet-pretty net))) (unless tdom (with-ipnet (net mask) tnet (setf tdom @@ -754,8 +726,8 @@ ;;; Zone file `~(~A~)' ;;; (generated ~A) -$ORIGIN ~@0*~(~A.~) -$TTL ~@2*~D~2%" +$ORIGIN ~0@*~(~A.~) +$TTL ~2@*~D~2%" (zone-name zone) (iso-date :now :datep t :timep t) (zone-default-ttl zone)) @@ -776,14 +748,11 @@ $TTL ~@2*~D~2%" (soa-expire soa) (soa-min-ttl soa))) (dolist (zr (zone-records zone)) - (case (zr-type zr) + (ecase (zr-type zr) (:a (printrec zr) (format stream "~A~%" (ipaddr-string (zr-data zr)))) - ((:ptr :cname) - (printrec zr) - (format stream "~A~%" (fix-host (zr-data zr)))) - (:ns + ((:ptr :cname :ns) (printrec zr) (format stream "~A~%" (fix-host (zr-data zr)))) (:mx