SetString() for a bunch of RR - to be extended

This commit is contained in:
Miek Gieben 2011-07-18 15:19:47 +02:00
parent 2e4f0cc015
commit 2eecc66477
4 changed files with 148 additions and 8 deletions

View File

@ -138,3 +138,10 @@ func TestParse(t *testing.T) {
} }
} }
} }
//
func TestSetString(t *testing.T) {
a := new(RR_A)
a.SetString("miek.nl. IN A 127.0.0.1")
println(a.String())
}

133
types.go
View File

@ -161,6 +161,19 @@ func (rr *RR_CNAME) String() string {
return rr.Hdr.String() + rr.Cname return rr.Hdr.String() + rr.Cname
} }
func (rr *RR_CNAME) SetString(s string) (*RR_CNAME, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_CNAME); !ok {
return nil, false
}
rr.Hdr = p.(*RR_CNAME).Hdr
rr.Cname = p.(*RR_CNAME).Cname
return rr, true
}
type RR_HINFO struct { type RR_HINFO struct {
Hdr RR_Header Hdr RR_Header
Cpu string Cpu string
@ -175,6 +188,20 @@ func (rr *RR_HINFO) String() string {
return rr.Hdr.String() + rr.Cpu + " " + rr.Os return rr.Hdr.String() + rr.Cpu + " " + rr.Os
} }
func (rr *RR_HINFO) SetString(s string) (*RR_HINFO, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_HINFO); !ok {
return nil, false
}
rr.Hdr = p.(*RR_HINFO).Hdr
rr.Cpu = p.(*RR_HINFO).Cpu
rr.Os = p.(*RR_HINFO).Os
return rr, true
}
type RR_MB struct { type RR_MB struct {
Hdr RR_Header Hdr RR_Header
Mb string "domain-name" Mb string "domain-name"
@ -188,6 +215,19 @@ func (rr *RR_MB) String() string {
return rr.Hdr.String() + rr.Mb return rr.Hdr.String() + rr.Mb
} }
func (rr *RR_MB) SetString(s string) (*RR_MB, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_MB); !ok {
return nil, false
}
rr.Hdr = p.(*RR_MB).Hdr
rr.Mb = p.(*RR_MB).Mb
return rr, true
}
type RR_MG struct { type RR_MG struct {
Hdr RR_Header Hdr RR_Header
Mg string "domain-name" Mg string "domain-name"
@ -242,6 +282,20 @@ func (rr *RR_MX) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Pref)) + " " + rr.Mx return rr.Hdr.String() + strconv.Itoa(int(rr.Pref)) + " " + rr.Mx
} }
func (rr *RR_MX) SetString(s string) (*RR_MX, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_MX); !ok {
return nil, false
}
rr.Hdr = p.(*RR_MX).Hdr
rr.Pref = p.(*RR_MX).Pref
rr.Mx = p.(*RR_MX).Mx
return rr, true
}
type RR_NS struct { type RR_NS struct {
Hdr RR_Header Hdr RR_Header
Ns string "domain-name" Ns string "domain-name"
@ -255,6 +309,19 @@ func (rr *RR_NS) String() string {
return rr.Hdr.String() + rr.Ns return rr.Hdr.String() + rr.Ns
} }
func (rr *RR_NS) SetString(s string) (*RR_NS, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_NS); !ok {
return nil, false
}
rr.Hdr = p.(*RR_NS).Hdr
rr.Ns = p.(*RR_NS).Ns
return rr, true
}
type RR_PTR struct { type RR_PTR struct {
Hdr RR_Header Hdr RR_Header
Ptr string "domain-name" Ptr string "domain-name"
@ -292,6 +359,24 @@ func (rr *RR_SOA) String() string {
" " + strconv.Itoa(int(rr.Minttl)) " " + strconv.Itoa(int(rr.Minttl))
} }
func (rr *RR_SOA) SetString(s string) (*RR_SOA, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_SOA); !ok {
return nil, false
}
rr.Hdr = p.(*RR_SOA).Hdr
rr.Ns = p.(*RR_SOA).Ns
rr.Mbox = p.(*RR_SOA).Mbox
rr.Refresh = p.(*RR_SOA).Refresh
rr.Retry = p.(*RR_SOA).Retry
rr.Expire = p.(*RR_SOA).Expire
rr.Minttl = p.(*RR_SOA).Minttl
return rr, true
}
type RR_TXT struct { type RR_TXT struct {
Hdr RR_Header Hdr RR_Header
Txt string "txt" Txt string "txt"
@ -305,6 +390,19 @@ func (rr *RR_TXT) String() string {
return rr.Hdr.String() + "\"" + rr.Txt + "\"" return rr.Hdr.String() + "\"" + rr.Txt + "\""
} }
func (rr *RR_TXT) SetString(s string) (*RR_TXT, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_TXT); !ok {
return nil, false
}
rr.Hdr = p.(*RR_TXT).Hdr
rr.Txt = p.(*RR_TXT).Txt
return rr, true
}
type RR_SRV struct { type RR_SRV struct {
Hdr RR_Header Hdr RR_Header
Priority uint16 Priority uint16
@ -395,6 +493,19 @@ func (rr *RR_A) String() string {
return rr.Hdr.String() + rr.A.String() return rr.Hdr.String() + rr.A.String()
} }
func (rr *RR_A) SetString(s string) (*RR_A, bool) {
p := parse(s)
if p == nil {
return nil, false
}
if _, ok := p.(*RR_A); !ok {
return nil, false
}
rr.Hdr = p.(*RR_A).Hdr
rr.A = p.(*RR_A).A
return rr, true
}
type RR_AAAA struct { type RR_AAAA struct {
Hdr RR_Header Hdr RR_Header
AAAA net.IP "AAAA" AAAA net.IP "AAAA"
@ -408,6 +519,19 @@ func (rr *RR_AAAA) String() string {
return rr.Hdr.String() + rr.AAAA.String() return rr.Hdr.String() + rr.AAAA.String()
} }
func (rr *RR_AAAA) SetString(s string) (*RR_AAAA, bool) {
p := parse(s)
if p != nil {
return nil, false
}
if _, ok := p.(*RR_AAAA); !ok {
return nil, false
}
rr.Hdr = p.(*RR_AAAA).Hdr
rr.AAAA = p.(*RR_AAAA).AAAA
return rr, true
}
type RR_LOC struct { type RR_LOC struct {
Hdr RR_Header Hdr RR_Header
Version uint8 Version uint8
@ -791,6 +915,15 @@ func tsigTimeToDate(t uint64) string {
return ti.Format("20060102030405") return ti.Format("20060102030405")
} }
// Helper function for parsing from strings
func parse(s string) RR {
rr, err := Zparse(strings.NewReader(s))
if err != nil {
return nil
}
return rr
}
// Map of constructors for each RR wire type. // Map of constructors for each RR wire type.
var rr_mk = map[int]func() RR{ var rr_mk = map[int]func() RR{
TypeCNAME: func() RR { return new(RR_CNAME) }, TypeCNAME: func() RR { return new(RR_CNAME) },

View File

@ -9,7 +9,6 @@ import (
"os" "os"
"io" "io"
"net" "net"
"bufio"
"strconv" "strconv"
) )
@ -60,7 +59,7 @@ func (to *token) reset() {
} }
// line 64 "zparse.go" // line 63 "zparse.go"
var z_start int = 1 var z_start int = 1
var z_first_final int = 102 var z_first_final int = 102
var z_error int = 0 var z_error int = 0
@ -68,15 +67,16 @@ var z_error int = 0
var z_en_main int = 1 var z_en_main int = 1
// line 63 "zparse.rl" // line 62 "zparse.rl"
// SetString
// All the NewReader stuff is expensive...
// only works for short io.Readers as we put the whole thing // only works for short io.Readers as we put the whole thing
// in a string -- needs to be extended for large files (sliding window). // 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) (rr RR, err os.Error) {
r := bufio.NewReader(q)
buf := make([]byte, _IOBUF) buf := make([]byte, _IOBUF)
n, err := r.Read(buf) n, err := q.Read(buf)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -7,7 +7,6 @@ import (
"os" "os"
"io" "io"
"net" "net"
"bufio"
"strconv" "strconv"
) )
@ -62,12 +61,13 @@ func (to *token) reset() {
write data; write data;
}%% }%%
// SetString
// All the NewReader stuff is expensive...
// only works for short io.Readers as we put the whole thing // only works for short io.Readers as we put the whole thing
// in a string -- needs to be extended for large files (sliding window). // 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) (rr RR, err os.Error) {
r := bufio.NewReader(q)
buf := make([]byte, _IOBUF) buf := make([]byte, _IOBUF)
n, err := r.Read(buf) n, err := q.Read(buf)
if err != nil { if err != nil {
return nil, err return nil, err
} }