From 2eecc6647758c6ada0832b83e73b41767efea108 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Mon, 18 Jul 2011 15:19:47 +0200 Subject: [PATCH] SetString() for a bunch of RR - to be extended --- parse_test.go | 7 +++ types.go | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++ zparse.go | 10 ++-- zparse.rl | 6 +-- 4 files changed, 148 insertions(+), 8 deletions(-) diff --git a/parse_test.go b/parse_test.go index c2a318c8..5b661897 100644 --- a/parse_test.go +++ b/parse_test.go @@ -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()) +} diff --git a/types.go b/types.go index 83f0cd0e..61ed1aa0 100644 --- a/types.go +++ b/types.go @@ -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) }, diff --git a/zparse.go b/zparse.go index af4e0bad..9558bfb5 100644 --- a/zparse.go +++ b/zparse.go @@ -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 } diff --git a/zparse.rl b/zparse.rl index 2dee2f4f..41128f99 100644 --- a/zparse.rl +++ b/zparse.rl @@ -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 }