AFSDB and SRV records; TXT records for base domain
authorAdam Chlipala <adamc@hcoop.net>
Tue, 1 Jan 2008 23:07:50 +0000 (23:07 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Tue, 1 Jan 2008 23:07:50 +0000 (23:07 +0000)
lib/bind.dtl
src/plugins/bind.sml

index 09d71e1..151c410 100644 (file)
@@ -2,14 +2,20 @@
 
 extern type dnsRecord;
 
+extern type srv_domain;
+{{Like <tt>domain</tt>, but may contain underscores}}
+
 extern val dnsA : host -> ip -> dnsRecord;
 extern val dnsAAAA : host -> ipv6 -> dnsRecord;
+extern val dnsAFSDB : domain -> dnsRecord;
 extern val dnsCNAME : host -> domain -> dnsRecord;
 extern val dnsMX : int -> domain -> dnsRecord;
 extern val dnsNS : domain -> dnsRecord;
+extern val dnsSRV : srv_domain -> int -> int -> int -> domain -> dnsRecord;
 extern val dnsTXT : host -> no_newlines -> dnsRecord;
 
 extern val dnsDefaultA : ip -> dnsRecord;
 extern val dnsDefaultAAAA : ipv6 -> dnsRecord;
+extern val dnsDefaultTXT : no_newlines -> dnsRecord;
 
 extern val dns : dnsRecord -> [Domain] {TTL : int};
index 53c1d04..3d79cbf 100644 (file)
@@ -53,6 +53,9 @@ datatype dns_record =
        | AAAA of string * string
        | DefaultAAAA of string
        | TXT of string * string
+       | DefaultTXT of string
+       | AFSDB of string
+       | SRV of string * int * int * int * string
 
 val record = fn (EApp ((EApp ((EVar "dnsA", _), e1), _), e2), _) =>
                (case (Env.string e1, Domain.ip e2) of
@@ -80,6 +83,14 @@ val record = fn (EApp ((EApp ((EVar "dnsA", _), e1), _), e2), _) =>
                (case (Env.string e1, Env.string e2) of
                     (SOME v1, SOME v2) => SOME (TXT (v1, v2))
                   | _ => NONE)
+             | (EApp ((EVar "dnsDefaultTXT", _), e), _) =>
+               Option.map DefaultTXT (Env.string e)
+             | (EApp ((EVar "dnsAFSDB", _), e), _) =>
+               Option.map AFSDB (Env.string e)
+             | (EApp ((EApp ((EApp ((EApp ((EApp ((EVar "dnsSRV", _), e1), _), e2), _), e3), _), e4), _), e5), _) =>
+               (case (Env.string e1, Env.int e2, Env.int e3, Env.int e4, Env.string e5) of
+                    (SOME v1, SOME v2, SOME v3, SOME v4, SOME v5) => SOME (SRV (v1, v2, v3, v4, v5))
+                  | _ => NONE)
              | _ => NONE
 
 fun writeRecord (evs, r) =
@@ -151,6 +162,34 @@ fun writeRecord (evs, r) =
                                   write "\tIN\tTXT\t\"";
                                   write (String.translate (fn #"\"" => "\\\"" | ch => str ch) to);
                                   write "\"\n")
+             | DefaultTXT to => (writeDom ();
+                                 write ".\t";
+                                 write (Int.toString ttl);
+                                 write "\tIN\tTXT\t\"";
+                                 write (String.translate (fn #"\"" => "\\\"" | ch => str ch) to);
+                                 write "\"\n")
+             | AFSDB host => (writeDom ();
+                              write ".\t";
+                              write (Int.toString ttl);
+                              write "\tIN\tAFSDB\t";
+                              write "1";
+                              write "\t";
+                              write host;
+                              write ".\n")
+             | SRV (from, priority, weight, port, to) => (write from;
+                                                          write ".";
+                                                          writeDom ();
+                                                          write ".\t";
+                                                          write (Int.toString ttl);
+                                                          write "\tIN\tSRV\t";
+                                                          write (Int.toString priority);
+                                                          write "\t";
+                                                          write (Int.toString weight);
+                                                          write "\t";
+                                                          write (Int.toString port);
+                                                          write "\t";
+                                                          write to;
+                                                          write ".\n")
        end
 
 val () = Env.actionV_one "dns"
@@ -326,4 +365,16 @@ val () = Domain.registerDescriber (Domain.considerAll
                                                     heading = "DNS zonefile contents:",
                                                     showEmpty = false}])
 
+fun validHost_ s =
+    size s > 0 andalso size s < 20
+    andalso CharVector.all (fn ch => Domain.isIdent ch orelse ch = #"-" orelse ch = #"_") s
+
+fun validSRVDomain s =
+    size s > 0 andalso size s < 100
+    andalso List.all validHost_ (String.fields (fn ch => ch = #".") s)
+
+val _ = Env.type_one "srv_domain"
+       Env.string
+       validSRVDomain
+
 end