Add features to soa parsing

This commit is contained in:
Miek Gieben 2012-02-15 09:04:09 +01:00
parent 697d67ea96
commit ef524d882a
3 changed files with 42 additions and 26 deletions

View File

@ -152,11 +152,18 @@ func TestDomainName(t *testing.T) {
}
}
func TestParseDirective(t *testing.T) {
func TestParseDirectiveMisc(t *testing.T) {
tests := map[string]string{
"$ORIGIN miek.nl.\na IN NS b": "a.miek.nl.\t3600\tIN\tNS\tb.miek.nl.",
"$TTL 2H\nmiek.nl. IN NS b.": "miek.nl.\t7200\tIN\tNS\tb.",
"miek.nl. 1D IN NS b.": "miek.nl.\t86400\tIN\tNS\tb.",
`name. IN SOA a6.nstld.com. hostmaster.nic.name. (
203362132 ; serial
5m ; refresh (5 minutes)
5m ; retry (5 minutes)
2w ; expire (2 weeks)
300 ; minimum (5 minutes)
)`: "name.\t3600\tIN\tSOA\ta6.nstld.com. hostmaster.nic.name. 203362132 300 300 1209600 300",
}
for i, o := range tests {
rr, e := NewRR(i)

View File

@ -256,7 +256,7 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
t <- Token{Error: e}
return
}
if ttl, ok := stringToTtl(l, f, t); !ok {
if ttl, ok := stringToTtl(l, f); !ok {
t <- Token{Error: &ParseError{f, "Expecting $TTL value, not this...", l}}
return
} else {
@ -314,7 +314,8 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
}
st = _EXPECT_ANY_NOCLASS_BL
case _STRING: // TTL is this case
if ttl, ok := stringToTtl(l, f, t); !ok {
if ttl, ok := stringToTtl(l, f); !ok {
t <- Token{Error: &ParseError{f, "Not a TTL", l}}
return
} else {
h.Ttl = ttl
@ -361,7 +362,8 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
case _EXPECT_ANY_NOCLASS:
switch l.value {
case _STRING: // TTL
if ttl, ok := stringToTtl(l, f, t); !ok {
if ttl, ok := stringToTtl(l, f); !ok {
t <- Token{Error: &ParseError{f, "Not a TTL", l}}
return
} else {
h.Ttl = ttl
@ -707,7 +709,7 @@ func typeToInt(token string) (uint16, bool) {
return uint16(typ), true
}
func stringToTtl(l lex, f string, t chan Token) (uint32, bool) {
func stringToTtl(l lex, f string) (uint32, bool) {
s := uint32(0)
i := uint32(0)
for _, c := range l.token {
@ -731,7 +733,6 @@ func stringToTtl(l lex, f string, t chan Token) (uint32, bool) {
i *= 10
i += uint32(c) - '0'
default:
t <- Token{Error: &ParseError{f, "Not a TTL", l}}
return 0, false
}
}

View File

@ -136,7 +136,7 @@ func setNS(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad NS Ns", l}
}
if rr.Ns[ld-1] != '.' {
rr.Ns = appendOrigin(rr.Ns, o)
rr.Ns = appendOrigin(rr.Ns, o)
}
return rr, nil
}
@ -152,7 +152,7 @@ func setPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad PTR Ptr", l}
}
if rr.Ptr[ld-1] != '.' {
rr.Ptr = appendOrigin(rr.Ptr, o)
rr.Ptr = appendOrigin(rr.Ptr, o)
}
return rr, nil
}
@ -175,7 +175,7 @@ func setMX(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad MX Mx", l}
}
if rr.Mx[ld-1] != '.' {
rr.Mx = appendOrigin(rr.Mx, o)
rr.Mx = appendOrigin(rr.Mx, o)
}
return rr, nil
}
@ -191,7 +191,7 @@ func setCNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad CNAME Cname", l}
}
if rr.Cname[ld-1] != '.' {
rr.Cname = appendOrigin(rr.Cname, o)
rr.Cname = appendOrigin(rr.Cname, o)
}
return rr, nil
}
@ -207,7 +207,7 @@ func setDNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad CNAME Target", l}
}
if rr.Target[ld-1] != '.' {
rr.Target = appendOrigin(rr.Target, o)
rr.Target = appendOrigin(rr.Target, o)
}
return rr, nil
}
@ -224,7 +224,7 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad SOA Ns", l}
}
if rr.Ns[ld-1] != '.' {
rr.Ns = appendOrigin(rr.Ns, o)
rr.Ns = appendOrigin(rr.Ns, o)
}
l = <-c
@ -234,32 +234,40 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad SOA Mbox", l}
}
if rr.Mbox[ld-1] != '.' {
rr.Mbox = appendOrigin(rr.Mbox, o)
rr.Mbox = appendOrigin(rr.Mbox, o)
}
<-c // _BLANK
var j int
var e error
var v uint32
for i := 0; i < 5; i++ {
l = <-c
if j, e = strconv.Atoi(l.token); e != nil {
return nil, &ParseError{f, "bad SOA zone parameter", l}
if j, e := strconv.Atoi(l.token); e != nil {
if i == 0 {
// Serial should be a number
return nil, &ParseError{f, "bad SOA zone parameter", l}
}
if v, ok = stringToTtl(l, f); !ok {
return nil, &ParseError{f, "bad SOA zone parameter", l}
}
} else {
v = uint32(j)
}
switch i {
case 0:
rr.Serial = uint32(j)
rr.Serial = v
<-c // _BLANK
case 1:
rr.Refresh = uint32(j)
rr.Refresh = v
<-c // _BLANK
case 2:
rr.Retry = uint32(j)
rr.Retry = v
<-c // _BLANK
case 3:
rr.Expire = uint32(j)
rr.Expire = v
<-c // _BLANK
case 4:
rr.Minttl = uint32(j)
rr.Minttl = v
}
}
return rr, nil
@ -297,7 +305,7 @@ func setSRV(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad SRV Target", l}
}
if rr.Target[ld-1] != '.' {
rr.Target = appendOrigin(rr.Target, o)
rr.Target = appendOrigin(rr.Target, o)
}
return rr, nil
}
@ -384,7 +392,7 @@ func setNAPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad NAPTR Replacement", l}
}
if rr.Replacement[ld-1] != '.' {
rr.Replacement = appendOrigin(rr.Replacement, o)
rr.Replacement = appendOrigin(rr.Replacement, o)
}
return rr, nil
}
@ -491,7 +499,7 @@ func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad RRSIG SignerName", l}
}
if rr.SignerName[ld-1] != '.' {
rr.SignerName = appendOrigin(rr.SignerName, o)
rr.SignerName = appendOrigin(rr.SignerName, o)
}
// Get the remaining data until we see a NEWLINE
l = <-c
@ -522,7 +530,7 @@ func setNSEC(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
return nil, &ParseError{f, "bad NSEC NextDomain", l}
}
if rr.NextDomain[ld-1] != '.' {
rr.NextDomain = appendOrigin(rr.NextDomain, o)
rr.NextDomain = appendOrigin(rr.NextDomain, o)
}
rr.TypeBitMap = make([]uint16, 0)