You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.3 KiB
181 lines
5.3 KiB
From: Michael Handler <handler@sub-rosa.com>
|
|
To: dns@list.cr.yp.to
|
|
Subject: tinydns-data SRV & axfr-get SRV/PTR patches
|
|
Date: Thu, 14 Sep 2000 20:37:50 -0400
|
|
|
|
Here's a combined patch that:
|
|
|
|
a) adds a native SRV type to tinydns-data
|
|
|
|
Sfqdn:ip:x:port:weight:priority:ttl:timestamp
|
|
|
|
Standard rules for ip, x, ttl, and timestamp apply. Port, weight, and
|
|
priority all range from 0-65535. Weight and priority are optional; they
|
|
default to zero if not provided.
|
|
|
|
Sconsole.zoinks.example.com:1.2.3.4:rack102-con1:2001:69:7:300:
|
|
|
|
b) makes axfr-get decompose SRV and PTR records and write them out in
|
|
native format, rather than opaque. Again, this is necessary because if the
|
|
DNAME fields in the records reference the same zone as fqdn, they can have
|
|
compression pointers that are bogus outside the context of that specific
|
|
packet, and which can't be correctly loaded into data.cdb by tinydns-data.
|
|
|
|
--michael
|
|
|
|
Laurent G. Bercot <ska-djbdns@skarnet.org> updated it for
|
|
djbdns-1.05. Documentation patch by Alex Efros.
|
|
|
|
diff -rNU3 djbdns-1.05/axfr-get.c djbdns-1.05-srv/axfr-get.c
|
|
--- djbdns-1.05/axfr-get.c Sun Feb 11 22:11:45 2001
|
|
+++ djbdns-1.05/axfr-get.c Thu Oct 18 14:46:56 2001
|
|
@@ -209,6 +209,26 @@
|
|
if (!stralloc_cats(&line,".:")) return 0;
|
|
if (!stralloc_catulong0(&line,dist,0)) return 0;
|
|
}
|
|
+ else if (byte_equal(data,2,DNS_T_SRV)) {
|
|
+ uint16 dist, weight, port;
|
|
+ if (!stralloc_copys(&line,"S")) return 0;
|
|
+ if (!dns_domain_todot_cat(&line,d1)) return 0;
|
|
+ if (!stralloc_cats(&line,"::")) return 0;
|
|
+ pos = x_copy(buf,len,pos,data,2);
|
|
+ uint16_unpack_big(data,&dist);
|
|
+ pos = x_copy(buf,len,pos,data,2);
|
|
+ uint16_unpack_big(data,&weight);
|
|
+ pos = x_copy(buf,len,pos,data,2);
|
|
+ uint16_unpack_big(data,&port);
|
|
+ x_getname(buf,len,pos,&d1);
|
|
+ if (!dns_domain_todot_cat(&line,d1)) return 0;
|
|
+ if (!stralloc_cats(&line,".:")) return 0;
|
|
+ if (!stralloc_catulong0(&line,dist,0)) return 0;
|
|
+ if (!stralloc_cats(&line,":")) return 0;
|
|
+ if (!stralloc_catulong0(&line,weight,0)) return 0;
|
|
+ if (!stralloc_cats(&line,":")) return 0;
|
|
+ if (!stralloc_catulong0(&line,port,0)) return 0;
|
|
+ }
|
|
else if (byte_equal(data,2,DNS_T_A) && (dlen == 4)) {
|
|
char ipstr[IP4_FMT];
|
|
if (!stralloc_copys(&line,"+")) return 0;
|
|
@@ -216,6 +236,14 @@
|
|
if (!stralloc_cats(&line,":")) return 0;
|
|
x_copy(buf,len,pos,data,4);
|
|
if (!stralloc_catb(&line,ipstr,ip4_fmt(ipstr,data))) return 0;
|
|
+ }
|
|
+ else if (byte_equal(data,2,DNS_T_PTR)) {
|
|
+ if (!stralloc_copys(&line,"^")) return 0;
|
|
+ if (!dns_domain_todot_cat(&line,d1)) return 0;
|
|
+ if (!stralloc_cats(&line,":")) return 0;
|
|
+ x_getname(buf,len,pos,&d1);
|
|
+ if (!dns_domain_todot_cat(&line,d1)) return 0;
|
|
+ if (!stralloc_cats(&line,".")) return 0;
|
|
}
|
|
else {
|
|
unsigned char ch;
|
|
diff -rNU3 djbdns-1.05/dns.h djbdns-1.05-srv/dns.h
|
|
--- djbdns-1.05/dns.h Sun Feb 11 22:11:45 2001
|
|
+++ djbdns-1.05/dns.h Thu Oct 18 14:46:56 2001
|
|
@@ -20,6 +20,7 @@
|
|
#define DNS_T_SIG "\0\30"
|
|
#define DNS_T_KEY "\0\31"
|
|
#define DNS_T_AAAA "\0\34"
|
|
+#define DNS_T_SRV "\0\41"
|
|
#define DNS_T_AXFR "\0\374"
|
|
#define DNS_T_ANY "\0\377"
|
|
|
|
diff -rNU3 djbdns-1.05/tinydns-data.c djbdns-1.05-srv/tinydns-data.c
|
|
--- djbdns-1.05/tinydns-data.c Sun Feb 11 22:11:45 2001
|
|
+++ djbdns-1.05/tinydns-data.c Thu Oct 18 14:50:53 2001
|
|
@@ -196,6 +196,7 @@
|
|
char type[2];
|
|
char soa[20];
|
|
char buf[4];
|
|
+ char srv[6];
|
|
|
|
umask(022);
|
|
|
|
@@ -360,6 +361,43 @@
|
|
rr_start(DNS_T_MX,ttl,ttd,loc);
|
|
uint16_pack_big(buf,u);
|
|
rr_add(buf,2);
|
|
+ rr_addname(d2);
|
|
+ rr_finish(d1);
|
|
+
|
|
+ if (ip4_scan(f[1].s,ip)) {
|
|
+ rr_start(DNS_T_A,ttl,ttd,loc);
|
|
+ rr_add(ip,4);
|
|
+ rr_finish(d2);
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case 'S':
|
|
+ if (!dns_domain_fromdot(&d1,f[0].s,f[0].len)) nomem();
|
|
+ if (!stralloc_0(&f[6])) nomem();
|
|
+ if (!scan_ulong(f[6].s,&ttl)) ttl = TTL_POSITIVE;
|
|
+ ttdparse(&f[7],ttd);
|
|
+ locparse(&f[8],loc);
|
|
+
|
|
+ if (!stralloc_0(&f[1])) nomem();
|
|
+
|
|
+ if (byte_chr(f[2].s,f[2].len,'.') >= f[2].len) {
|
|
+ if (!stralloc_cats(&f[2],".srv.")) nomem();
|
|
+ if (!stralloc_catb(&f[2],f[0].s,f[0].len)) nomem();
|
|
+ }
|
|
+ if (!dns_domain_fromdot(&d2,f[2].s,f[2].len)) nomem();
|
|
+
|
|
+ if (!stralloc_0(&f[4])) nomem();
|
|
+ if (!scan_ulong(f[4].s,&u)) u = 0;
|
|
+ uint16_pack_big(srv,u);
|
|
+ if (!stralloc_0(&f[5])) nomem();
|
|
+ if (!scan_ulong(f[5].s,&u)) u = 0;
|
|
+ uint16_pack_big(srv + 2,u);
|
|
+ if (!stralloc_0(&f[3])) nomem();
|
|
+ if (!scan_ulong(f[3].s,&u)) nomem();
|
|
+ uint16_pack_big(srv + 4,u);
|
|
+
|
|
+ rr_start(DNS_T_SRV,ttl,ttd,loc);
|
|
+ rr_add(srv,6);
|
|
rr_addname(d2);
|
|
rr_finish(d1);
|
|
|
|
--- djbdns-1.05/man/tinydns-data.8 2003-10-23 10:47:32.000000000 +0300
|
|
+++ djbdns-1.05/man/tinydns-data.8 2014-09-26 02:51:59.861716505 +0300
|
|
@@ -487,6 +487,38 @@
|
|
.RI \ 072
|
|
is a colon.
|
|
|
|
+.RI S fqdn\fR:\fIip\fR:\fIx\fR:\fIport\fR:\fIweight\fR:\fIpriority\fR:\fIttl\fR:\fItimestamp\fR:\fIlo\fR
|
|
+
|
|
+SRV record for
|
|
+.IR fqdn .
|
|
+
|
|
+.B tinydns-data
|
|
+creates
|
|
+.IP
|
|
+an SRV record
|
|
+showing
|
|
+.IR x\fR.srv.\fIfqdn\fR:\fIport\fR
|
|
+as a service for
|
|
+.IR fqdn
|
|
+with given \fIweight\fR and \fIpriority\fR
|
|
+(\fIport\fR, \fIweight\fR and \fIpriority\fR must be in range 0-65535;
|
|
+\fIweight\fR and \fIpriority\fR are optional;
|
|
+they default to zero if not provided)
|
|
+and
|
|
+.P
|
|
+.IP
|
|
+an A record showing
|
|
+.I ip
|
|
+as the IP address
|
|
+of
|
|
+.IR x\fR.srv.\fIfqdn .
|
|
+.P
|
|
+
|
|
+If
|
|
+.I x
|
|
+contains a dot
|
|
+then it is treated specially; see above.
|
|
+
|
|
.RI ^ fqdn\fR:\fIp\fR:\fIttl\fR:\fItimestamp\fR:\fIlo\fR
|
|
|
|
PTR record for
|