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
}
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 {
Hdr RR_Header
Cpu string
@ -175,6 +188,20 @@ func (rr *RR_HINFO) String() string {
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 {
Hdr RR_Header
Mb string "domain-name"
@ -188,6 +215,19 @@ func (rr *RR_MB) String() string {
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 {
Hdr RR_Header
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
}
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 {
Hdr RR_Header
Ns string "domain-name"
@ -255,6 +309,19 @@ func (rr *RR_NS) String() string {
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 {
Hdr RR_Header
Ptr string "domain-name"
@ -292,6 +359,24 @@ func (rr *RR_SOA) String() string {
" " + 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 {
Hdr RR_Header
Txt string "txt"
@ -305,6 +390,19 @@ func (rr *RR_TXT) String() string {
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 {
Hdr RR_Header
Priority uint16
@ -395,6 +493,19 @@ func (rr *RR_A) String() 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 {
Hdr RR_Header
AAAA net.IP "AAAA"
@ -408,6 +519,19 @@ func (rr *RR_AAAA) String() 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 {
Hdr RR_Header
Version uint8
@ -791,6 +915,15 @@ func tsigTimeToDate(t uint64) string {
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.
var rr_mk = map[int]func() RR{
TypeCNAME: func() RR { return new(RR_CNAME) },

View File

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

View File

@ -7,7 +7,6 @@ import (
"os"
"io"
"net"
"bufio"
"strconv"
)
@ -62,12 +61,13 @@ func (to *token) reset() {
write data;
}%%
// SetString
// 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) {
r := bufio.NewReader(q)
buf := make([]byte, _IOBUF)
n, err := r.Read(buf)
n, err := q.Read(buf)
if err != nil {
return nil, err
}