zone.lisp: Add seconds-to-timespec conversion and use it when dumping SOA.
[zone] / addr-family-ipv6.lisp
index 3c37907..ae886c2 100644 (file)
 
     ;; Third step: output the two parts of the address either side of the
     ;; longest zero run.  If there are no zero words in the address, just
-    ;; write the whole thing.
+    ;; write the whole thing.  There's a special case here for the
+    ;; IPv6-mapped IPv4 address space ::ffff:0.0.0.0/96.
     (with-output-to-string (out)
       (flet ((chunk (start end)
               (when (< start end)
                     (incf i)
                     (when (>= i end) (return))
                     (write-char #\: out))))))
-       (cond (best-start
+       (cond ((< best-length 2)
+              (chunk 0 8))
+             ((and (= best-start 0)
+                   (or (and (= best-length 5)
+                            (= (aref words 5) #xffff))
+                       (= best-length 6)))
+              (let ((v4addr (make-instance 'ip4addr
+                                           :addr (ldb (byte 32 0) addr))))
+                (write-string "::" out)
+                (when (= best-length 5)
+                  (chunk 5 6)
+                  (write-char #\: out))
+                (write-string (ipaddr-string v4addr) out)))
+             (t
               (chunk 0 best-start)
               (write-string "::" out)
-              (chunk (+ best-start best-length) 8))
-             (t
-              (chunk 0 8)))))))
+              (chunk (+ best-start best-length) 8)))))))
 
 ;;;--------------------------------------------------------------------------
 ;;; IPv6 networks.
 
 (defmethod reverse-domain-component-width ((ipaddr ip6addr)) 4)
 (defmethod reverse-domain-radix ((ipaddr ip6addr)) 16)
-(defmethod reverse-domain-suffix ((ipaddr ip6addr)) "ip6.arpa")
+(defmethod reverse-domain-suffix ((ipaddr ip6addr))
+  (make-domain-name :labels (list "arpa" "ip6") :absolutep t))
 
 ;;;----- That's all, folks --------------------------------------------------