diff --git a/README.markdown b/README.markdown index 413b664e..db084340 100644 --- a/README.markdown +++ b/README.markdown @@ -5,13 +5,13 @@ supported including DNSSEC types. Feaures: -* EDNS0 (see edns.go) * UDP/TCP queries, IPv4 and IPv6 * TSIG +* EDNS0 (see edns.go) * AXFR (and IXFR probably) * Client and server side programming (mimicking the http package) * Asynchronous queries (client/server) -* RFC 1035 zone file parsing (work in progress) +* RFC 1035 zone file parsing (everything, except multiline records work) Sample programs can be found in the `_examples` directory. They can be build with: `make examples` (after the dns package has been installed) @@ -49,6 +49,7 @@ Miek Gieben - 2010, 2011 - miek@miek.nl * 5155 - NSEC * 5933 - GOST * 5936 - AXFR +* xxxx - ECCDSA ## Loosely based upon: diff --git a/TODO b/TODO index 3391bb9b..5e94badf 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ Issues: * Check the network order, it works now, but this is on Intel?? * Make the testsuite work with public DNS servers -* pack/Unpack smaller. EDNS 'n stuff can be folded in??? * Compression. Take stuff from Jan Mercl Todo: @@ -9,6 +8,7 @@ Todo: * HIP RR (needs list of domain names, need slice stuff for that) * Is subdomain, is glue helper functions for this kind of stuff * Cleanups +* Fix multiline RR when parsing Examples: * Test impl of nameserver, with a small zone, 1 KSK and online signing diff --git a/zparse.go b/zparse.go index f6a101cd..49dbe38d 100644 --- a/zparse.go +++ b/zparse.go @@ -66,6 +66,7 @@ func Zparse(q io.Reader) (z *Zone, err os.Error) { z = new(Zone) data := string(buf) + // guardian if data[len(data)-1] != '\n' { data += "\n" } @@ -78,10 +79,10 @@ func Zparse(q io.Reader) (z *Zone, err os.Error) { hdr := new(RR_Header) -// line 82 "zparse.go" +// line 83 "zparse.go" cs = z_start -// line 85 "zparse.go" +// line 86 "zparse.go" { if p == pe { goto _test_eof } switch cs { @@ -96,7 +97,7 @@ tr27: rr.A = net.ParseIP(rdf[0]) z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr32: @@ -118,7 +119,7 @@ tr32: rr.AAAA = net.ParseIP(rdf[0]) z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr43: @@ -131,7 +132,7 @@ tr43: rr.Cname = rdf[0] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr52: @@ -147,7 +148,7 @@ tr52: rr.PublicKey = rdf[3] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr55: @@ -163,7 +164,7 @@ tr55: rr.Digest = rdf[3] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr59: @@ -177,7 +178,7 @@ tr59: rr.Mx = rdf[1] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr63: @@ -190,7 +191,7 @@ tr63: rr.Ns = rdf[0] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr70: @@ -211,7 +212,7 @@ tr70: rr.Signature = rdf[9] z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr75: @@ -230,11 +231,11 @@ tr75: rr.Minttl = uint32(atoi(rdf[6])) z.Push(rr) } -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 tr85: -// line 77 "zparse.rl" +// line 78 "zparse.rl" { lines++ } goto st54 st54: @@ -242,7 +243,7 @@ st54: if p == pe { goto _test_eof54 } fallthrough case 54: -// line 246 "zparse.go" +// line 247 "zparse.go" switch data[p] { case 9: goto st1 case 10: goto tr85 @@ -266,7 +267,7 @@ st0: cs = 0; goto _out; tr82: -// line 73 "zparse.rl" +// line 74 "zparse.rl" { hdr.Name = data[mark:p] } goto st1 st1: @@ -274,7 +275,7 @@ st1: if p == pe { goto _test_eof1 } fallthrough case 1: -// line 278 "zparse.go" +// line 279 "zparse.go" switch data[p] { case 9: goto st1 case 32: goto st1 @@ -300,9 +301,9 @@ case 1: if 48 <= data[p] && data[p] <= 57 { goto tr2 } goto st0 tr2: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st2 st2: @@ -310,7 +311,7 @@ st2: if p == pe { goto _test_eof2 } fallthrough case 2: -// line 314 "zparse.go" +// line 315 "zparse.go" switch data[p] { case 9: goto tr12 case 32: goto tr12 @@ -318,7 +319,7 @@ case 2: if 48 <= data[p] && data[p] <= 57 { goto st2 } goto st0 tr12: -// line 76 "zparse.rl" +// line 77 "zparse.rl" { ttl := atoi(data[mark:p]); hdr.Ttl = uint32(ttl) } goto st3 st3: @@ -326,7 +327,7 @@ st3: if p == pe { goto _test_eof3 } fallthrough case 3: -// line 330 "zparse.go" +// line 331 "zparse.go" switch data[p] { case 9: goto st3 case 32: goto st3 @@ -351,7 +352,7 @@ case 3: } goto st0 tr3: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st4 st4: @@ -359,7 +360,7 @@ st4: if p == pe { goto _test_eof4 } fallthrough case 4: -// line 363 "zparse.go" +// line 364 "zparse.go" switch data[p] { case 10: goto st0 case 65: goto tr25 @@ -367,7 +368,7 @@ case 4: } goto tr24 tr24: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st5 st5: @@ -375,11 +376,11 @@ st5: if p == pe { goto _test_eof5 } fallthrough case 5: -// line 379 "zparse.go" +// line 380 "zparse.go" if data[p] == 10 { goto tr27 } goto st5 tr25: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st6 st6: @@ -387,7 +388,7 @@ st6: if p == pe { goto _test_eof6 } fallthrough case 6: -// line 391 "zparse.go" +// line 392 "zparse.go" switch data[p] { case 10: goto tr27 case 65: goto st7 @@ -413,7 +414,7 @@ case 8: if data[p] == 10 { goto tr27 } goto tr30 tr30: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st9 st9: @@ -421,11 +422,11 @@ st9: if p == pe { goto _test_eof9 } fallthrough case 9: -// line 425 "zparse.go" +// line 426 "zparse.go" if data[p] == 10 { goto tr32 } goto st9 tr16: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st10 st10: @@ -433,7 +434,7 @@ st10: if p == pe { goto _test_eof10 } fallthrough case 10: -// line 437 "zparse.go" +// line 438 "zparse.go" switch data[p] { case 72: goto st11 case 78: goto st14 @@ -452,11 +453,11 @@ case 11: } goto st0 tr80: -// line 76 "zparse.rl" +// line 77 "zparse.rl" { ttl := atoi(data[mark:p]); hdr.Ttl = uint32(ttl) } goto st12 tr35: -// line 74 "zparse.rl" +// line 75 "zparse.rl" { hdr.Class = Str_class[data[mark:p]] } goto st12 st12: @@ -464,7 +465,7 @@ st12: if p == pe { goto _test_eof12 } fallthrough case 12: -// line 468 "zparse.go" +// line 469 "zparse.go" switch data[p] { case 9: goto st12 case 32: goto st12 @@ -532,7 +533,7 @@ case 17: if data[p] == 10 { goto st0 } goto tr41 tr41: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st18 st18: @@ -540,11 +541,11 @@ st18: if p == pe { goto _test_eof18 } fallthrough case 18: -// line 544 "zparse.go" +// line 545 "zparse.go" if data[p] == 10 { goto tr43 } goto st18 tr5: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st19 st19: @@ -552,7 +553,7 @@ st19: if p == pe { goto _test_eof19 } fallthrough case 19: -// line 556 "zparse.go" +// line 557 "zparse.go" switch data[p] { case 78: goto st20 case 83: goto st26 @@ -608,7 +609,7 @@ case 24: if data[p] == 10 { goto st0 } goto tr50 tr50: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st25 st25: @@ -616,7 +617,7 @@ st25: if p == pe { goto _test_eof25 } fallthrough case 25: -// line 620 "zparse.go" +// line 621 "zparse.go" if data[p] == 10 { goto tr52 } goto st25 st26: @@ -627,7 +628,7 @@ case 26: if data[p] == 10 { goto st0 } goto tr53 tr53: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st27 st27: @@ -635,11 +636,11 @@ st27: if p == pe { goto _test_eof27 } fallthrough case 27: -// line 639 "zparse.go" +// line 640 "zparse.go" if data[p] == 10 { goto tr55 } goto st27 tr8: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st28 st28: @@ -647,7 +648,7 @@ st28: if p == pe { goto _test_eof28 } fallthrough case 28: -// line 651 "zparse.go" +// line 652 "zparse.go" switch data[p] { case 88: goto st29 case 120: goto st29 @@ -661,7 +662,7 @@ case 29: if data[p] == 10 { goto st0 } goto tr57 tr57: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st30 st30: @@ -669,11 +670,11 @@ st30: if p == pe { goto _test_eof30 } fallthrough case 30: -// line 673 "zparse.go" +// line 674 "zparse.go" if data[p] == 10 { goto tr59 } goto st30 tr9: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st31 st31: @@ -681,7 +682,7 @@ st31: if p == pe { goto _test_eof31 } fallthrough case 31: -// line 685 "zparse.go" +// line 686 "zparse.go" switch data[p] { case 83: goto st32 case 115: goto st32 @@ -695,7 +696,7 @@ case 32: if data[p] == 10 { goto st0 } goto tr61 tr61: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st33 st33: @@ -703,11 +704,11 @@ st33: if p == pe { goto _test_eof33 } fallthrough case 33: -// line 707 "zparse.go" +// line 708 "zparse.go" if data[p] == 10 { goto tr63 } goto st33 tr10: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st34 st34: @@ -715,7 +716,7 @@ st34: if p == pe { goto _test_eof34 } fallthrough case 34: -// line 719 "zparse.go" +// line 720 "zparse.go" switch data[p] { case 82: goto st35 case 114: goto st35 @@ -759,7 +760,7 @@ case 38: if data[p] == 10 { goto st0 } goto tr68 tr68: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st39 st39: @@ -767,11 +768,11 @@ st39: if p == pe { goto _test_eof39 } fallthrough case 39: -// line 771 "zparse.go" +// line 772 "zparse.go" if data[p] == 10 { goto tr70 } goto st39 tr11: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } goto st40 st40: @@ -779,7 +780,7 @@ st40: if p == pe { goto _test_eof40 } fallthrough case 40: -// line 783 "zparse.go" +// line 784 "zparse.go" switch data[p] { case 79: goto st41 case 111: goto st41 @@ -803,7 +804,7 @@ case 42: if data[p] == 10 { goto st0 } goto tr73 tr73: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st43 st43: @@ -811,11 +812,11 @@ st43: if p == pe { goto _test_eof43 } fallthrough case 43: -// line 815 "zparse.go" +// line 816 "zparse.go" if data[p] == 10 { goto tr75 } goto st43 tr18: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st44 st44: @@ -823,14 +824,14 @@ st44: if p == pe { goto _test_eof44 } fallthrough case 44: -// line 827 "zparse.go" +// line 828 "zparse.go" switch data[p] { case 83: goto st11 case 115: goto st11 } goto st0 tr19: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st45 st45: @@ -838,16 +839,16 @@ st45: if p == pe { goto _test_eof45 } fallthrough case 45: -// line 842 "zparse.go" +// line 843 "zparse.go" switch data[p] { case 78: goto st11 case 110: goto st11 } goto st0 tr4: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st46 st46: @@ -855,7 +856,7 @@ st46: if p == pe { goto _test_eof46 } fallthrough case 46: -// line 859 "zparse.go" +// line 860 "zparse.go" switch data[p] { case 72: goto st47 case 78: goto st14 @@ -874,7 +875,7 @@ case 47: } goto st0 tr77: -// line 74 "zparse.rl" +// line 75 "zparse.rl" { hdr.Class = Str_class[data[mark:p]] } goto st48 st48: @@ -882,7 +883,7 @@ st48: if p == pe { goto _test_eof48 } fallthrough case 48: -// line 886 "zparse.go" +// line 887 "zparse.go" switch data[p] { case 9: goto st48 case 32: goto st48 @@ -904,7 +905,7 @@ case 48: if 48 <= data[p] && data[p] <= 57 { goto tr79 } goto st0 tr79: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st49 st49: @@ -912,7 +913,7 @@ st49: if p == pe { goto _test_eof49 } fallthrough case 49: -// line 916 "zparse.go" +// line 917 "zparse.go" switch data[p] { case 9: goto tr80 case 32: goto tr80 @@ -920,9 +921,9 @@ case 49: if 48 <= data[p] && data[p] <= 57 { goto st49 } goto st0 tr6: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st50 st50: @@ -930,16 +931,16 @@ st50: if p == pe { goto _test_eof50 } fallthrough case 50: -// line 934 "zparse.go" +// line 935 "zparse.go" switch data[p] { case 83: goto st47 case 115: goto st47 } goto st0 tr7: -// line 75 "zparse.rl" +// line 76 "zparse.rl" { /* ... */ } -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st51 st51: @@ -947,14 +948,14 @@ st51: if p == pe { goto _test_eof51 } fallthrough case 51: -// line 951 "zparse.go" +// line 952 "zparse.go" switch data[p] { case 78: goto st47 case 110: goto st47 } goto st0 tr86: -// line 72 "zparse.rl" +// line 73 "zparse.rl" { mark = p } goto st52 st52: @@ -962,7 +963,7 @@ st52: if p == pe { goto _test_eof52 } fallthrough case 52: -// line 966 "zparse.go" +// line 967 "zparse.go" switch data[p] { case 9: goto tr82 case 32: goto tr82 @@ -1047,7 +1048,7 @@ case 53: _out: {} } -// line 122 "zparse.rl" +// line 123 "zparse.rl" if eof > -1 {