diff options
Diffstat (limited to 'src/pkg/net/dnsmsg.go')
| -rw-r--r-- | src/pkg/net/dnsmsg.go | 444 |
1 files changed, 222 insertions, 222 deletions
diff --git a/src/pkg/net/dnsmsg.go b/src/pkg/net/dnsmsg.go index 2bcb88206..01bb49078 100644 --- a/src/pkg/net/dnsmsg.go +++ b/src/pkg/net/dnsmsg.go @@ -24,9 +24,9 @@ package net import ( - "fmt"; - "os"; - "reflect"; + "fmt" + "os" + "reflect" ) // Packet formats @@ -34,77 +34,77 @@ import ( // Wire constants. const ( // valid _DNS_RR_Header.Rrtype and _DNS_Question.qtype - _DNS_TypeA = 1; - _DNS_TypeNS = 2; - _DNS_TypeMD = 3; - _DNS_TypeMF = 4; - _DNS_TypeCNAME = 5; - _DNS_TypeSOA = 6; - _DNS_TypeMB = 7; - _DNS_TypeMG = 8; - _DNS_TypeMR = 9; - _DNS_TypeNULL = 10; - _DNS_TypeWKS = 11; - _DNS_TypePTR = 12; - _DNS_TypeHINFO = 13; - _DNS_TypeMINFO = 14; - _DNS_TypeMX = 15; - _DNS_TypeTXT = 16; + _DNS_TypeA = 1 + _DNS_TypeNS = 2 + _DNS_TypeMD = 3 + _DNS_TypeMF = 4 + _DNS_TypeCNAME = 5 + _DNS_TypeSOA = 6 + _DNS_TypeMB = 7 + _DNS_TypeMG = 8 + _DNS_TypeMR = 9 + _DNS_TypeNULL = 10 + _DNS_TypeWKS = 11 + _DNS_TypePTR = 12 + _DNS_TypeHINFO = 13 + _DNS_TypeMINFO = 14 + _DNS_TypeMX = 15 + _DNS_TypeTXT = 16 // valid _DNS_Question.qtype only - _DNS_TypeAXFR = 252; - _DNS_TypeMAILB = 253; - _DNS_TypeMAILA = 254; - _DNS_TypeALL = 255; + _DNS_TypeAXFR = 252 + _DNS_TypeMAILB = 253 + _DNS_TypeMAILA = 254 + _DNS_TypeALL = 255 // valid _DNS_Question.qclass - _DNS_ClassINET = 1; - _DNS_ClassCSNET = 2; - _DNS_ClassCHAOS = 3; - _DNS_ClassHESIOD = 4; - _DNS_ClassANY = 255; + _DNS_ClassINET = 1 + _DNS_ClassCSNET = 2 + _DNS_ClassCHAOS = 3 + _DNS_ClassHESIOD = 4 + _DNS_ClassANY = 255 // _DNS_Msg.rcode - _DNS_RcodeSuccess = 0; - _DNS_RcodeFormatError = 1; - _DNS_RcodeServerFailure = 2; - _DNS_RcodeNameError = 3; - _DNS_RcodeNotImplemented = 4; - _DNS_RcodeRefused = 5; + _DNS_RcodeSuccess = 0 + _DNS_RcodeFormatError = 1 + _DNS_RcodeServerFailure = 2 + _DNS_RcodeNameError = 3 + _DNS_RcodeNotImplemented = 4 + _DNS_RcodeRefused = 5 ) // The wire format for the DNS packet header. type __DNS_Header struct { - Id uint16; - Bits uint16; - Qdcount, Ancount, Nscount, Arcount uint16; + Id uint16 + Bits uint16 + Qdcount, Ancount, Nscount, Arcount uint16 } const ( // __DNS_Header.Bits - _QR = 1 << 15; // query/response (response=1) - _AA = 1 << 10; // authoritative - _TC = 1 << 9; // truncated - _RD = 1 << 8; // recursion desired - _RA = 1 << 7; // recursion available + _QR = 1 << 15 // query/response (response=1) + _AA = 1 << 10 // authoritative + _TC = 1 << 9 // truncated + _RD = 1 << 8 // recursion desired + _RA = 1 << 7 // recursion available ) // DNS queries. type _DNS_Question struct { - Name string "domain-name"; // "domain-name" specifies encoding; see packers below - Qtype uint16; - Qclass uint16; + Name string "domain-name" // "domain-name" specifies encoding; see packers below + Qtype uint16 + Qclass uint16 } // DNS responses (resource records). // There are many types of messages, // but they all share the same header. type _DNS_RR_Header struct { - Name string "domain-name"; - Rrtype uint16; - Class uint16; - Ttl uint32; - Rdlength uint16; // length of data after header + Name string "domain-name" + Rrtype uint16 + Class uint16 + Ttl uint32 + Rdlength uint16 // length of data after header } func (h *_DNS_RR_Header) Header() *_DNS_RR_Header { @@ -112,15 +112,15 @@ func (h *_DNS_RR_Header) Header() *_DNS_RR_Header { } type _DNS_RR interface { - Header() *_DNS_RR_Header; + Header() *_DNS_RR_Header } // Specific DNS RR formats for each query type. type _DNS_RR_CNAME struct { - Hdr _DNS_RR_Header; - Cname string "domain-name"; + Hdr _DNS_RR_Header + Cname string "domain-name" } func (rr *_DNS_RR_CNAME) Header() *_DNS_RR_Header { @@ -128,9 +128,9 @@ func (rr *_DNS_RR_CNAME) Header() *_DNS_RR_Header { } type _DNS_RR_HINFO struct { - Hdr _DNS_RR_Header; - Cpu string; - Os string; + Hdr _DNS_RR_Header + Cpu string + Os string } func (rr *_DNS_RR_HINFO) Header() *_DNS_RR_Header { @@ -138,8 +138,8 @@ func (rr *_DNS_RR_HINFO) Header() *_DNS_RR_Header { } type _DNS_RR_MB struct { - Hdr _DNS_RR_Header; - Mb string "domain-name"; + Hdr _DNS_RR_Header + Mb string "domain-name" } func (rr *_DNS_RR_MB) Header() *_DNS_RR_Header { @@ -147,8 +147,8 @@ func (rr *_DNS_RR_MB) Header() *_DNS_RR_Header { } type _DNS_RR_MG struct { - Hdr _DNS_RR_Header; - Mg string "domain-name"; + Hdr _DNS_RR_Header + Mg string "domain-name" } func (rr *_DNS_RR_MG) Header() *_DNS_RR_Header { @@ -156,9 +156,9 @@ func (rr *_DNS_RR_MG) Header() *_DNS_RR_Header { } type _DNS_RR_MINFO struct { - Hdr _DNS_RR_Header; - Rmail string "domain-name"; - Email string "domain-name"; + Hdr _DNS_RR_Header + Rmail string "domain-name" + Email string "domain-name" } func (rr *_DNS_RR_MINFO) Header() *_DNS_RR_Header { @@ -166,8 +166,8 @@ func (rr *_DNS_RR_MINFO) Header() *_DNS_RR_Header { } type _DNS_RR_MR struct { - Hdr _DNS_RR_Header; - Mr string "domain-name"; + Hdr _DNS_RR_Header + Mr string "domain-name" } func (rr *_DNS_RR_MR) Header() *_DNS_RR_Header { @@ -175,9 +175,9 @@ func (rr *_DNS_RR_MR) Header() *_DNS_RR_Header { } type _DNS_RR_MX struct { - Hdr _DNS_RR_Header; - Pref uint16; - Mx string "domain-name"; + Hdr _DNS_RR_Header + Pref uint16 + Mx string "domain-name" } func (rr *_DNS_RR_MX) Header() *_DNS_RR_Header { @@ -185,8 +185,8 @@ func (rr *_DNS_RR_MX) Header() *_DNS_RR_Header { } type _DNS_RR_NS struct { - Hdr _DNS_RR_Header; - Ns string "domain-name"; + Hdr _DNS_RR_Header + Ns string "domain-name" } func (rr *_DNS_RR_NS) Header() *_DNS_RR_Header { @@ -194,8 +194,8 @@ func (rr *_DNS_RR_NS) Header() *_DNS_RR_Header { } type _DNS_RR_PTR struct { - Hdr _DNS_RR_Header; - Ptr string "domain-name"; + Hdr _DNS_RR_Header + Ptr string "domain-name" } func (rr *_DNS_RR_PTR) Header() *_DNS_RR_Header { @@ -203,14 +203,14 @@ func (rr *_DNS_RR_PTR) Header() *_DNS_RR_Header { } type _DNS_RR_SOA struct { - Hdr _DNS_RR_Header; - Ns string "domain-name"; - Mbox string "domain-name"; - Serial uint32; - Refresh uint32; - Retry uint32; - Expire uint32; - Minttl uint32; + Hdr _DNS_RR_Header + Ns string "domain-name" + Mbox string "domain-name" + Serial uint32 + Refresh uint32 + Retry uint32 + Expire uint32 + Minttl uint32 } func (rr *_DNS_RR_SOA) Header() *_DNS_RR_Header { @@ -218,8 +218,8 @@ func (rr *_DNS_RR_SOA) Header() *_DNS_RR_Header { } type _DNS_RR_TXT struct { - Hdr _DNS_RR_Header; - Txt string; // not domain name + Hdr _DNS_RR_Header + Txt string // not domain name } func (rr *_DNS_RR_TXT) Header() *_DNS_RR_Header { @@ -227,11 +227,11 @@ func (rr *_DNS_RR_TXT) Header() *_DNS_RR_Header { } type _DNS_RR_A struct { - Hdr _DNS_RR_Header; - A uint32 "ipv4"; + Hdr _DNS_RR_Header + A uint32 "ipv4" } -func (rr *_DNS_RR_A) Header() *_DNS_RR_Header { return &rr.Hdr } +func (rr *_DNS_RR_A) Header() *_DNS_RR_Header { return &rr.Hdr } // Packing and unpacking. @@ -271,30 +271,30 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) { // We trade each dot byte for a length byte. // There is also a trailing zero. // Check that we have all the space we need. - tot := len(s) + 1; + tot := len(s) + 1 if off+tot > len(msg) { return len(msg), false } // Emit sequence of counted strings, chopping at dots. - begin := 0; + begin := 0 for i := 0; i < len(s); i++ { if s[i] == '.' { - if i-begin >= 1<<6 { // top two bits of length must be clear + if i-begin >= 1<<6 { // top two bits of length must be clear return len(msg), false } - msg[off] = byte(i - begin); - off++; + msg[off] = byte(i - begin) + off++ for j := begin; j < i; j++ { - msg[off] = s[j]; - off++; + msg[off] = s[j] + off++ } - begin = i + 1; + begin = i + 1 } } - msg[off] = 0; - off++; - return off, true; + msg[off] = 0 + off++ + return off, true } // Unpack a domain name. @@ -311,15 +311,15 @@ func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) { // In theory, the pointers are only allowed to jump backward. // We let them jump anywhere and stop jumping after a while. func unpackDomainName(msg []byte, off int) (s string, off1 int, ok bool) { - s = ""; - ptr := 0; // number of pointers followed + s = "" + ptr := 0 // number of pointers followed Loop: for { if off >= len(msg) { return "", len(msg), false } - c := int(msg[off]); - off++; + c := int(msg[off]) + off++ switch c & 0xC0 { case 0x00: if c == 0x00 { @@ -330,8 +330,8 @@ Loop: if off+c > len(msg) { return "", len(msg), false } - s += string(msg[off:off+c]) + "."; - off += c; + s += string(msg[off:off+c]) + "." + off += c case 0xC0: // pointer to somewhere else in msg. // remember location after first ptr, @@ -341,15 +341,15 @@ Loop: if off >= len(msg) { return "", len(msg), false } - c1 := msg[off]; - off++; + c1 := msg[off] + off++ if ptr == 0 { off1 = off } if ptr++; ptr > 10 { return "", len(msg), false } - off = (c^0xC0)<<8 | int(c1); + off = (c^0xC0)<<8 | int(c1) default: // 0x80 and 0x40 are reserved return "", len(msg), false @@ -358,7 +358,7 @@ Loop: if ptr == 0 { off1 = off } - return s, off1, true; + return s, off1, true } // TODO(rsc): Move into generic library? @@ -366,41 +366,41 @@ Loop: // and other (often anonymous) structs. func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) { for i := 0; i < val.NumField(); i++ { - f := val.Type().(*reflect.StructType).Field(i); + f := val.Type().(*reflect.StructType).Field(i) switch fv := val.Field(i).(type) { default: - fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type); - return len(msg), false; + fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type) + return len(msg), false case *reflect.StructValue: off, ok = packStructValue(fv, msg, off) case *reflect.Uint16Value: - i := fv.Get(); + i := fv.Get() if off+2 > len(msg) { return len(msg), false } - msg[off] = byte(i >> 8); - msg[off+1] = byte(i); - off += 2; + msg[off] = byte(i >> 8) + msg[off+1] = byte(i) + off += 2 case *reflect.Uint32Value: - i := fv.Get(); + i := fv.Get() if off+4 > len(msg) { return len(msg), false } - msg[off] = byte(i >> 24); - msg[off+1] = byte(i >> 16); - msg[off+2] = byte(i >> 8); - msg[off+4] = byte(i); - off += 4; + msg[off] = byte(i >> 24) + msg[off+1] = byte(i >> 16) + msg[off+2] = byte(i >> 8) + msg[off+4] = byte(i) + off += 4 case *reflect.StringValue: // There are multiple string encodings. // The tag distinguishes ordinary strings from domain names. - s := fv.Get(); + s := fv.Get() switch f.Tag { default: - fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag); - return len(msg), false; + fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag) + return len(msg), false case "domain-name": - off, ok = packDomainName(s, msg, off); + off, ok = packDomainName(s, msg, off) if !ok { return len(msg), false } @@ -409,16 +409,16 @@ func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, o if len(s) > 255 || off+1+len(s) > len(msg) { return len(msg), false } - msg[off] = byte(len(s)); - off++; + msg[off] = byte(len(s)) + off++ for i := 0; i < len(s); i++ { msg[off+i] = s[i] } - off += len(s); + off += len(s) } } } - return off, true; + return off, true } func structValue(any interface{}) *reflect.StructValue { @@ -426,8 +426,8 @@ func structValue(any interface{}) *reflect.StructValue { } func packStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) { - off, ok = packStructValue(structValue(any), msg, off); - return off, ok; + off, ok = packStructValue(structValue(any), msg, off) + return off, ok } // TODO(rsc): Move into generic library? @@ -435,35 +435,35 @@ func packStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) { // Same restrictions as packStructValue. func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) { for i := 0; i < val.NumField(); i++ { - f := val.Type().(*reflect.StructType).Field(i); + f := val.Type().(*reflect.StructType).Field(i) switch fv := val.Field(i).(type) { default: - fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type); - return len(msg), false; + fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type) + return len(msg), false case *reflect.StructValue: off, ok = unpackStructValue(fv, msg, off) case *reflect.Uint16Value: if off+2 > len(msg) { return len(msg), false } - i := uint16(msg[off])<<8 | uint16(msg[off+1]); - fv.Set(i); - off += 2; + i := uint16(msg[off])<<8 | uint16(msg[off+1]) + fv.Set(i) + off += 2 case *reflect.Uint32Value: if off+4 > len(msg) { return len(msg), false } - i := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]); - fv.Set(i); - off += 4; + i := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) + fv.Set(i) + off += 4 case *reflect.StringValue: - var s string; + var s string switch f.Tag { default: - fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag); - return len(msg), false; + fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag) + return len(msg), false case "domain-name": - s, off, ok = unpackDomainName(msg, off); + s, off, ok = unpackDomainName(msg, off) if !ok { return len(msg), false } @@ -471,24 +471,24 @@ func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, if off >= len(msg) || off+1+int(msg[off]) > len(msg) { return len(msg), false } - n := int(msg[off]); - off++; - b := make([]byte, n); + n := int(msg[off]) + off++ + b := make([]byte, n) for i := 0; i < n; i++ { b[i] = msg[off+i] } - off += n; - s = string(b); + off += n + s = string(b) } - fv.Set(s); + fv.Set(s) } } - return off, true; + return off, true } func unpackStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) { - off, ok = unpackStructValue(structValue(any), msg, off); - return off, ok; + off, ok = unpackStructValue(structValue(any), msg, off) + return off, ok } // Generic struct printer. @@ -496,72 +496,72 @@ func unpackStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) { // but does look for an "ipv4" tag on uint32 variables, // printing them as IP addresses. func printStructValue(val *reflect.StructValue) string { - s := "{"; + s := "{" for i := 0; i < val.NumField(); i++ { if i > 0 { s += ", " } - f := val.Type().(*reflect.StructType).Field(i); + f := val.Type().(*reflect.StructType).Field(i) if !f.Anonymous { s += f.Name + "=" } - fval := val.Field(i); + fval := val.Field(i) if fv, ok := fval.(*reflect.StructValue); ok { s += printStructValue(fv) } else if fv, ok := fval.(*reflect.Uint32Value); ok && f.Tag == "ipv4" { - i := fv.Get(); - s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String(); + i := fv.Get() + s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String() } else { s += fmt.Sprint(fval.Interface()) } } - s += "}"; - return s; + s += "}" + return s } -func printStruct(any interface{}) string { return printStructValue(structValue(any)) } +func printStruct(any interface{}) string { return printStructValue(structValue(any)) } // Resource record packer. func packRR(rr _DNS_RR, msg []byte, off int) (off2 int, ok bool) { - var off1 int; + var off1 int // pack twice, once to find end of header // and again to find end of packet. // a bit inefficient but this doesn't need to be fast. // off1 is end of header // off2 is end of rr - off1, ok = packStruct(rr.Header(), msg, off); - off2, ok = packStruct(rr, msg, off); + off1, ok = packStruct(rr.Header(), msg, off) + off2, ok = packStruct(rr, msg, off) if !ok { return len(msg), false } // pack a third time; redo header with correct data length - rr.Header().Rdlength = uint16(off2 - off1); - packStruct(rr.Header(), msg, off); - return off2, true; + rr.Header().Rdlength = uint16(off2 - off1) + packStruct(rr.Header(), msg, off) + return off2, true } // Resource record unpacker. func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) { // unpack just the header, to find the rr type and length - var h _DNS_RR_Header; - off0 := off; + var h _DNS_RR_Header + off0 := off if off, ok = unpackStruct(&h, msg, off); !ok { return nil, len(msg), false } - end := off + int(h.Rdlength); + end := off + int(h.Rdlength) // make an rr of that type and re-unpack. // again inefficient but doesn't need to be fast. - mk, known := rr_mk[int(h.Rrtype)]; + mk, known := rr_mk[int(h.Rrtype)] if !known { return &h, end, true } - rr = mk(); - off, ok = unpackStruct(rr, msg, off0); + rr = mk() + off, ok = unpackStruct(rr, msg, off0) if off != end { return &h, end, true } - return rr, off, ok; + return rr, off, ok } // Usable representation of a DNS packet. @@ -569,31 +569,31 @@ func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) { // A manually-unpacked version of (id, bits). // This is in its own struct for easy printing. type __DNS_Msg_Top struct { - id uint16; - response bool; - opcode int; - authoritative bool; - truncated bool; - recursion_desired bool; - recursion_available bool; - rcode int; + id uint16 + response bool + opcode int + authoritative bool + truncated bool + recursion_desired bool + recursion_available bool + rcode int } type _DNS_Msg struct { - __DNS_Msg_Top; - question []_DNS_Question; - answer []_DNS_RR; - ns []_DNS_RR; - extra []_DNS_RR; + __DNS_Msg_Top + question []_DNS_Question + answer []_DNS_RR + ns []_DNS_RR + extra []_DNS_RR } func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) { - var dh __DNS_Header; + var dh __DNS_Header // Convert convenient _DNS_Msg into wire-like __DNS_Header. - dh.Id = dns.id; - dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode); + dh.Id = dns.id + dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode) if dns.recursion_available { dh.Bits |= _RA } @@ -611,24 +611,24 @@ func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) { } // Prepare variable sized arrays. - question := dns.question; - answer := dns.answer; - ns := dns.ns; - extra := dns.extra; + question := dns.question + answer := dns.answer + ns := dns.ns + extra := dns.extra - dh.Qdcount = uint16(len(question)); - dh.Ancount = uint16(len(answer)); - dh.Nscount = uint16(len(ns)); - dh.Arcount = uint16(len(extra)); + dh.Qdcount = uint16(len(question)) + dh.Ancount = uint16(len(answer)) + dh.Nscount = uint16(len(ns)) + dh.Arcount = uint16(len(extra)) // Could work harder to calculate message size, // but this is far more than we need and not // big enough to hurt the allocator. - msg = make([]byte, 2000); + msg = make([]byte, 2000) // Pack it in: header and then the pieces. - off := 0; - off, ok = packStruct(&dh, msg, off); + off := 0 + off, ok = packStruct(&dh, msg, off) for i := 0; i < len(question); i++ { off, ok = packStruct(&question[i], msg, off) } @@ -644,31 +644,31 @@ func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) { if !ok { return nil, false } - return msg[0:off], true; + return msg[0:off], true } func (dns *_DNS_Msg) Unpack(msg []byte) bool { // Header. - var dh __DNS_Header; - off := 0; - var ok bool; + var dh __DNS_Header + off := 0 + var ok bool if off, ok = unpackStruct(&dh, msg, off); !ok { return false } - dns.id = dh.Id; - dns.response = (dh.Bits & _QR) != 0; - dns.opcode = int(dh.Bits>>11) & 0xF; - dns.authoritative = (dh.Bits & _AA) != 0; - dns.truncated = (dh.Bits & _TC) != 0; - dns.recursion_desired = (dh.Bits & _RD) != 0; - dns.recursion_available = (dh.Bits & _RA) != 0; - dns.rcode = int(dh.Bits & 0xF); + dns.id = dh.Id + dns.response = (dh.Bits & _QR) != 0 + dns.opcode = int(dh.Bits>>11) & 0xF + dns.authoritative = (dh.Bits & _AA) != 0 + dns.truncated = (dh.Bits & _TC) != 0 + dns.recursion_desired = (dh.Bits & _RD) != 0 + dns.recursion_available = (dh.Bits & _RA) != 0 + dns.rcode = int(dh.Bits & 0xF) // Arrays. - dns.question = make([]_DNS_Question, dh.Qdcount); - dns.answer = make([]_DNS_RR, dh.Ancount); - dns.ns = make([]_DNS_RR, dh.Nscount); - dns.extra = make([]_DNS_RR, dh.Arcount); + dns.question = make([]_DNS_Question, dh.Qdcount) + dns.answer = make([]_DNS_RR, dh.Ancount) + dns.ns = make([]_DNS_RR, dh.Nscount) + dns.extra = make([]_DNS_RR, dh.Arcount) for i := 0; i < len(dns.question); i++ { off, ok = unpackStruct(&dns.question[i], msg, off) @@ -688,34 +688,34 @@ func (dns *_DNS_Msg) Unpack(msg []byte) bool { // if off != len(msg) { // println("extra bytes in dns packet", off, "<", len(msg)); // } - return true; + return true } func (dns *_DNS_Msg) String() string { - s := "DNS: " + printStruct(&dns.__DNS_Msg_Top) + "\n"; + s := "DNS: " + printStruct(&dns.__DNS_Msg_Top) + "\n" if len(dns.question) > 0 { - s += "-- Questions\n"; + s += "-- Questions\n" for i := 0; i < len(dns.question); i++ { s += printStruct(&dns.question[i]) + "\n" } } if len(dns.answer) > 0 { - s += "-- Answers\n"; + s += "-- Answers\n" for i := 0; i < len(dns.answer); i++ { s += printStruct(dns.answer[i]) + "\n" } } if len(dns.ns) > 0 { - s += "-- Name servers\n"; + s += "-- Name servers\n" for i := 0; i < len(dns.ns); i++ { s += printStruct(dns.ns[i]) + "\n" } } if len(dns.extra) > 0 { - s += "-- Extra\n"; + s += "-- Extra\n" for i := 0; i < len(dns.extra); i++ { s += printStruct(dns.extra[i]) + "\n" } } - return s; + return s } |
