Parsing zone files - does not work (yet)

This commit is contained in:
Miek Gieben 2011-07-18 20:47:03 +02:00
parent 0742f1e75f
commit 7c716e66c0
7 changed files with 384 additions and 275 deletions

View File

@ -14,14 +14,16 @@ GOFILES=\
dnssec.go\
edns.go\
keygen.go\
kparse.go\
msg.go\
nsec3.go \
server.go \
tsig.go\
types.go\
zparse.go\
kparse.go\
xfr.go\
zone.go\
zparse.go\
include $(GOROOT)/src/Make.pkg

View File

@ -114,10 +114,11 @@ func (r *RR_DNSKEY) PrivateKeyString(p PrivateKey) (s string) {
// Do I want Read/SetString or both???
func (k *RR_DNSKEY) Read(q io.Reader) os.Error {
r, e := Zparse(q)
if e != nil || r == nil {
z, e := Zparse(q)
if e != nil || z == nil {
return e
}
r := z.Pop().(RR)
if _, ok := r.(*RR_DNSKEY); !ok {
panic("did not read a DNSKEY")
}

View File

@ -131,11 +131,12 @@ func TestParse(t *testing.T) {
"nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh",
}
for test, result := range tests {
r, err := Zparse(strings.NewReader(test))
if err != nil || r == nil{
z, err := Zparse(strings.NewReader(test))
if err != nil || z == nil{
t.Logf("Error of nil r %v %s\n", err, test)
t.Fail()
}
r := z.Pop().(RR)
if r.String() != result {
t.Logf("\"%s\" should be equal to\n\"%s\"\n", r, result)
t.Fail()

View File

@ -7,9 +7,9 @@ package dns
import (
"net"
"time"
"strconv"
"strings"
"time"
)
// Packet formats
@ -954,11 +954,11 @@ func tsigTimeToDate(t uint64) string {
// Helper function for parsing from strings
func parse(s string) RR {
rr, err := Zparse(strings.NewReader(s))
z, err := Zparse(strings.NewReader(s))
if err != nil {
return nil
}
return rr
return z.Pop().(RR)
}
// Map of constructors for each RR wire type.

38
zone.go Normal file
View File

@ -0,0 +1,38 @@
// Copyright 2011 Miek Gieben. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Implements a concept of zones. In its most basic form
// a list of RRs.
package dns
import (
"container/vector"
)
type Zone struct {
v vector.Vector
}
func (z *Zone) Push(r RR) {
z.v.Push(r)
}
func (z *Zone) Pop() RR {
return z.v.Pop().(RR)
}
func (z *Zone) At(i int) RR {
return z.v.At(i).(RR)
}
func (z *Zone) Len() int {
return z.v.Len()
}
func (z *Zone) String() string {
for i:=0; i < z.Len(); i++ {
println(z.At(i).String())
}
return ""
}

576
zparse.go

File diff suppressed because it is too large Load Diff

View File

@ -65,23 +65,24 @@ func (to *token) reset() {
// All the NewReader stuff is expensive...
// only works for short io.Readers as we put the whole thing
// in a string -- needs to be extended for large files (sliding window).
func Zparse(q io.Reader) (rr RR, err os.Error) {
func Zparse(q io.Reader) (z *Zone, err os.Error) {
buf := make([]byte, _IOBUF)
n, err := q.Read(buf)
if err != nil {
println("RETURNING HERE\n")
return nil, err
}
buf = buf[:n]
z = new(Zone)
data := string(buf)
cs, p, pe, eof := 0, 0, len(data), len(data)
mark := 0
hdr := new(RR_Header)
tok := newToken()
var rr RR
%%{
# can't do comments yet
# can't do comments yet TODO
action mark { mark = p }
action qname { hdr.Name = data[mark:p] }
action qclass { hdr.Class = Str_class[data[mark:p]] }
@ -90,6 +91,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
action number { tok.pushInt(data[mark:p]) }
action text { tok.pushString(data[mark:p]) }
action textblank { tok.pushString(data[mark:p]) }
action set { z.Push(rr); tok.reset(); println("setting") }
action qtype {
i := Str_rr[data[mark:p]]
@ -105,11 +107,12 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
qclass = ('IN'i|'CS'i|'CH'i|'HS'i|'ANY'i|'NONE'i) %qclass;
ttl = digit+ >mark;
bl = [ \t]+ %mark;
qname = [a-zA-Z0-9.\\_]+ %qname;
qname = [\-a-zA-Z0-9.\\_]+ %qname;
# If I use this in the definitions at the end, things break.
# 6l seems to hang when compiling the resulting .go file...
tb = [ a-zA-Z0-9.\\/+=:]+ $1 %0 %textblank;
t = [a-zA-Z0-9.\\/+=:]+ $1 %0 %text;
# tb is WITH the space
tb = [\-a-zA-Z0-9.\\/+=: ]+ $1 %0 %textblank;
t = [\-a-zA-Z0-9.\\/+=:]+ $1 %0 %text;
n = [0-9]+ $1 %0 %number;
comment = /^;/;
@ -132,7 +135,7 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
| ('DS'i %qtype bl n bl n bl n bl t) %rdata_ds
| ('DNSKEY'i %qtype bl n bl n bl n bl t) %rdata_dnskey
| ('RRSIG'i %qtype bl n bl n bl n bl n bl n bl n bl n bl t bl t) %rdata_rrsig
);
) %set;
rr = lhs rhs;
main := rr+;
@ -145,11 +148,11 @@ func Zparse(q io.Reader) (rr RR, err os.Error) {
// No clue what I'm doing what so ever
if p == pe {
println("unexpected eof")
return rr, nil
return z, nil
} else {
println("error at position ", p)
return rr, nil
return z, nil
}
}
return rr, nil
return z, nil
}