diff --git a/customrrex_test.go b/customrrex_test.go deleted file mode 100644 index 8bcf6c1a..00000000 --- a/customrrex_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package dns_test - -import ( - "errors" - "fmt" - "github.com/miekg/dns" - "log" - "net" -) - -const TypeAPAIR = 0x0F99 - -type APAIR struct { - addr [2]net.IP -} - -func NewAPAIR() dns.PrivateRdata { return new(APAIR) } - -func (rd *APAIR) String() string { return rd.addr[0].String() + " " + rd.addr[1].String() } -func (rd *APAIR) ParseTextSlice(txt []string) error { - if len(txt) != 2 { - return errors.New("Two addresses required for APAIR") - } - for i, s := range txt { - ip := net.ParseIP(s) - if ip == nil { - return errors.New("Invalid IP in APAIR text representation") - } - rd.addr[i] = ip - } - return nil -} - -func (rd *APAIR) WriteByteSlice(buf []byte) (int, error) { - b := append([]byte(rd.addr[0]), []byte(rd.addr[1])...) - n := copy(buf, b) - if n != len(b) { - return n, dns.ErrBuf - } - return n, nil -} - -func (rd *APAIR) ParseByteSlice(buf []byte) (int, error) { - ln := net.IPv4len * 2 - if len(buf) != ln { - return 0, errors.New("Invalid length of APAIR rdata") - } - cp := make([]byte, ln) - copy(cp, buf) // clone bytes to use them in IPs - - rd.addr[0] = net.IP(cp[:3]) - rd.addr[1] = net.IP(cp[4:]) - - return len(buf), nil -} - -func (rd *APAIR) PasteRdata(dest dns.PrivateRdata) error { - cp := make([]byte, rd.RdataLen()) - _, err := rd.WriteByteSlice(cp) - if err != nil { - return err - } - - d := dest.(*APAIR) - d.addr[0] = net.IP(cp[:3]) - d.addr[1] = net.IP(cp[4:]) - return nil -} - -func (rd *APAIR) RdataLen() int { - return net.IPv4len * 2 -} - -func ExampleNewPrivateRR() { - dns.NewPrivateRR("APAIR", TypeAPAIR, NewAPAIR) - defer dns.DelPrivateRR(TypeAPAIR) - - rr, err := dns.NewRR("miek.nl. APAIR (1.2.3.4 1.2.3.5)") - if err != nil { - log.Fatal("Could not parse APAIR record: ", err) - } - fmt.Println(rr) - // Output: miek.nl. 3600 IN APAIR 1.2.3.4 1.2.3.5 - - m := new(dns.Msg) - m.Id = 12345 - m.SetQuestion("miek.nl.", TypeAPAIR) - m.Answer = append(m.Answer, rr) - - fmt.Println(m) - // ;; opcode: QUERY, status: NOERROR, id: 12345 - // ;; flags: rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 - // - // ;; QUESTION SECTION: - // ;miek.nl. IN APAIR - // - // ;; ANSWER SECTION: - // miek.nl. 3600 IN APAIR 1.2.3.4 1.2.3.5 -} diff --git a/example_test.go b/example_test.go index 4bdeaa52..f778adfa 100644 --- a/example_test.go +++ b/example_test.go @@ -1,25 +1,29 @@ -package dns +package dns_test import ( + "errors" "fmt" + "github.com/miekg/dns" + "log" + "net" ) // Retrieve the MX records for miek.nl. func ExampleMX() { - config, _ := ClientConfigFromFile("/etc/resolv.conf") - c := new(Client) - m := new(Msg) - m.SetQuestion("miek.nl.", TypeMX) + config, _ := dns.ClientConfigFromFile("/etc/resolv.conf") + c := new(dns.Client) + m := new(dns.Msg) + m.SetQuestion("miek.nl.", dns.TypeMX) m.RecursionDesired = true r, _, err := c.Exchange(m, config.Servers[0]+":"+config.Port) if err != nil { return } - if r.Rcode != RcodeSuccess { + if r.Rcode != dns.RcodeSuccess { return } for _, a := range r.Answer { - if mx, ok := a.(*MX); ok { + if mx, ok := a.(*dns.MX); ok { fmt.Printf("%s\n", mx.String()) } } @@ -28,26 +32,116 @@ func ExampleMX() { // Retrieve the DNSKEY records of a zone and convert them // to DS records for SHA1, SHA256 and SHA384. func ExampleDS(zone string) { - config, _ := ClientConfigFromFile("/etc/resolv.conf") - c := new(Client) - m := new(Msg) + config, _ := dns.ClientConfigFromFile("/etc/resolv.conf") + c := new(dns.Client) + m := new(dns.Msg) if zone == "" { zone = "miek.nl" } - m.SetQuestion(Fqdn(zone), TypeDNSKEY) + m.SetQuestion(dns.Fqdn(zone), dns.TypeDNSKEY) m.SetEdns0(4096, true) r, _, err := c.Exchange(m, config.Servers[0]+":"+config.Port) if err != nil { return } - if r.Rcode != RcodeSuccess { + if r.Rcode != dns.RcodeSuccess { return } for _, k := range r.Answer { - if key, ok := k.(*DNSKEY); ok { - for _, alg := range []int{SHA1, SHA256, SHA384} { + if key, ok := k.(*dns.DNSKEY); ok { + for _, alg := range []int{dns.SHA1, dns.SHA256, dns.SHA384} { fmt.Printf("%s; %d\n", key.ToDS(alg).String(), key.Flags) } } } } + +const TypeAPAIR = 0x0F99 + +type APAIR struct { + addr [2]net.IP +} + +func NewAPAIR() dns.PrivateRdata { return new(APAIR) } + +func (rd *APAIR) String() string { return rd.addr[0].String() + " " + rd.addr[1].String() } +func (rd *APAIR) ParseTextSlice(txt []string) error { + if len(txt) != 2 { + return errors.New("Two addresses required for APAIR") + } + for i, s := range txt { + ip := net.ParseIP(s) + if ip == nil { + return errors.New("Invalid IP in APAIR text representation") + } + rd.addr[i] = ip + } + return nil +} + +func (rd *APAIR) WriteByteSlice(buf []byte) (int, error) { + b := append([]byte(rd.addr[0]), []byte(rd.addr[1])...) + n := copy(buf, b) + if n != len(b) { + return n, dns.ErrBuf + } + return n, nil +} + +func (rd *APAIR) ParseByteSlice(buf []byte) (int, error) { + ln := net.IPv4len * 2 + if len(buf) != ln { + return 0, errors.New("Invalid length of APAIR rdata") + } + cp := make([]byte, ln) + copy(cp, buf) // clone bytes to use them in IPs + + rd.addr[0] = net.IP(cp[:3]) + rd.addr[1] = net.IP(cp[4:]) + + return len(buf), nil +} + +func (rd *APAIR) PasteRdata(dest dns.PrivateRdata) error { + cp := make([]byte, rd.RdataLen()) + _, err := rd.WriteByteSlice(cp) + if err != nil { + return err + } + + d := dest.(*APAIR) + d.addr[0] = net.IP(cp[:3]) + d.addr[1] = net.IP(cp[4:]) + return nil +} + +func (rd *APAIR) RdataLen() int { + return net.IPv4len * 2 +} + +func ExampleNewPrivateRR() { + dns.NewPrivateRR("APAIR", TypeAPAIR, NewAPAIR) + defer dns.DelPrivateRR(TypeAPAIR) + + rr, err := dns.NewRR("miek.nl. APAIR (1.2.3.4 1.2.3.5)") + if err != nil { + log.Fatal("Could not parse APAIR record: ", err) + } + fmt.Println(rr) + // Output: miek.nl. 3600 IN APAIR 1.2.3.4 1.2.3.5 + + m := new(dns.Msg) + m.Id = 12345 + m.SetQuestion("miek.nl.", TypeAPAIR) + m.Answer = append(m.Answer, rr) + + fmt.Println(m) + // ;; opcode: QUERY, status: NOERROR, id: 12345 + // ;; flags: rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 + // + // ;; QUESTION SECTION: + // ;miek.nl. IN APAIR + // + // ;; ANSWER SECTION: + // miek.nl. 3600 IN APAIR 1.2.3.4 1.2.3.5 +}