From ef524d882a5b841f524c5bc8a300b6669385c883 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Wed, 15 Feb 2012 09:04:09 +0100 Subject: [PATCH] Add features to soa parsing --- parse_test.go | 9 ++++++++- zscan.go | 11 ++++++----- zscan_rr.go | 48 ++++++++++++++++++++++++++++-------------------- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/parse_test.go b/parse_test.go index dcbab987..1713d41d 100644 --- a/parse_test.go +++ b/parse_test.go @@ -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) diff --git a/zscan.go b/zscan.go index 8836258d..a11edff9 100644 --- a/zscan.go +++ b/zscan.go @@ -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 } } diff --git a/zscan_rr.go b/zscan_rr.go index 3fcec668..dd9dd77f 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -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)