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{ tests := map[string]string{
"$ORIGIN miek.nl.\na IN NS b": "a.miek.nl.\t3600\tIN\tNS\tb.miek.nl.", "$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.", "$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.", "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 { for i, o := range tests {
rr, e := NewRR(i) 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} t <- Token{Error: e}
return 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}} t <- Token{Error: &ParseError{f, "Expecting $TTL value, not this...", l}}
return return
} else { } else {
@ -314,7 +314,8 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
} }
st = _EXPECT_ANY_NOCLASS_BL st = _EXPECT_ANY_NOCLASS_BL
case _STRING: // TTL is this case 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 return
} else { } else {
h.Ttl = ttl h.Ttl = ttl
@ -361,7 +362,8 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
case _EXPECT_ANY_NOCLASS: case _EXPECT_ANY_NOCLASS:
switch l.value { switch l.value {
case _STRING: // TTL 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 return
} else { } else {
h.Ttl = ttl h.Ttl = ttl
@ -707,7 +709,7 @@ func typeToInt(token string) (uint16, bool) {
return uint16(typ), true 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) s := uint32(0)
i := uint32(0) i := uint32(0)
for _, c := range l.token { for _, c := range l.token {
@ -731,7 +733,6 @@ func stringToTtl(l lex, f string, t chan Token) (uint32, bool) {
i *= 10 i *= 10
i += uint32(c) - '0' i += uint32(c) - '0'
default: default:
t <- Token{Error: &ParseError{f, "Not a TTL", l}}
return 0, false 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} return nil, &ParseError{f, "bad NS Ns", l}
} }
if rr.Ns[ld-1] != '.' { if rr.Ns[ld-1] != '.' {
rr.Ns = appendOrigin(rr.Ns, o) rr.Ns = appendOrigin(rr.Ns, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad PTR Ptr", l}
} }
if rr.Ptr[ld-1] != '.' { if rr.Ptr[ld-1] != '.' {
rr.Ptr = appendOrigin(rr.Ptr, o) rr.Ptr = appendOrigin(rr.Ptr, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad MX Mx", l}
} }
if rr.Mx[ld-1] != '.' { if rr.Mx[ld-1] != '.' {
rr.Mx = appendOrigin(rr.Mx, o) rr.Mx = appendOrigin(rr.Mx, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad CNAME Cname", l}
} }
if rr.Cname[ld-1] != '.' { if rr.Cname[ld-1] != '.' {
rr.Cname = appendOrigin(rr.Cname, o) rr.Cname = appendOrigin(rr.Cname, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad CNAME Target", l}
} }
if rr.Target[ld-1] != '.' { if rr.Target[ld-1] != '.' {
rr.Target = appendOrigin(rr.Target, o) rr.Target = appendOrigin(rr.Target, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad SOA Ns", l}
} }
if rr.Ns[ld-1] != '.' { if rr.Ns[ld-1] != '.' {
rr.Ns = appendOrigin(rr.Ns, o) rr.Ns = appendOrigin(rr.Ns, o)
} }
l = <-c 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} return nil, &ParseError{f, "bad SOA Mbox", l}
} }
if rr.Mbox[ld-1] != '.' { if rr.Mbox[ld-1] != '.' {
rr.Mbox = appendOrigin(rr.Mbox, o) rr.Mbox = appendOrigin(rr.Mbox, o)
} }
<-c // _BLANK <-c // _BLANK
var j int var v uint32
var e error
for i := 0; i < 5; i++ { for i := 0; i < 5; i++ {
l = <-c l = <-c
if j, e = strconv.Atoi(l.token); e != nil { if j, e := strconv.Atoi(l.token); e != nil {
return nil, &ParseError{f, "bad SOA zone parameter", l} 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 { switch i {
case 0: case 0:
rr.Serial = uint32(j) rr.Serial = v
<-c // _BLANK <-c // _BLANK
case 1: case 1:
rr.Refresh = uint32(j) rr.Refresh = v
<-c // _BLANK <-c // _BLANK
case 2: case 2:
rr.Retry = uint32(j) rr.Retry = v
<-c // _BLANK <-c // _BLANK
case 3: case 3:
rr.Expire = uint32(j) rr.Expire = v
<-c // _BLANK <-c // _BLANK
case 4: case 4:
rr.Minttl = uint32(j) rr.Minttl = v
} }
} }
return rr, nil 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} return nil, &ParseError{f, "bad SRV Target", l}
} }
if rr.Target[ld-1] != '.' { if rr.Target[ld-1] != '.' {
rr.Target = appendOrigin(rr.Target, o) rr.Target = appendOrigin(rr.Target, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad NAPTR Replacement", l}
} }
if rr.Replacement[ld-1] != '.' { if rr.Replacement[ld-1] != '.' {
rr.Replacement = appendOrigin(rr.Replacement, o) rr.Replacement = appendOrigin(rr.Replacement, o)
} }
return rr, nil 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} return nil, &ParseError{f, "bad RRSIG SignerName", l}
} }
if rr.SignerName[ld-1] != '.' { 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 // Get the remaining data until we see a NEWLINE
l = <-c 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} return nil, &ParseError{f, "bad NSEC NextDomain", l}
} }
if rr.NextDomain[ld-1] != '.' { if rr.NextDomain[ld-1] != '.' {
rr.NextDomain = appendOrigin(rr.NextDomain, o) rr.NextDomain = appendOrigin(rr.NextDomain, o)
} }
rr.TypeBitMap = make([]uint16, 0) rr.TypeBitMap = make([]uint16, 0)