Formatting
This commit is contained in:
parent
93a7feb0a7
commit
f44bf2d656
|
@ -90,7 +90,7 @@ func (r *Resolver) FromFile(conf string) os.Error {
|
|||
}
|
||||
r.Attempts = n
|
||||
case s == "rotate":
|
||||
/* not imp */
|
||||
/* not imp */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
16
defaults.go
16
defaults.go
|
@ -4,13 +4,13 @@ package dns
|
|||
|
||||
// Create a reply packet.
|
||||
func (dns *Msg) SetReply(request *Msg) {
|
||||
dns.MsgHdr.Id = request.MsgHdr.Id
|
||||
dns.MsgHdr.Authoritative = true
|
||||
dns.MsgHdr.Response = true
|
||||
dns.MsgHdr.Opcode = OpcodeQuery
|
||||
dns.MsgHdr.Rcode = RcodeSuccess
|
||||
dns.Question = make([]Question, 1)
|
||||
dns.Question[0] = request.Question[0]
|
||||
dns.MsgHdr.Id = request.MsgHdr.Id
|
||||
dns.MsgHdr.Authoritative = true
|
||||
dns.MsgHdr.Response = true
|
||||
dns.MsgHdr.Opcode = OpcodeQuery
|
||||
dns.MsgHdr.Rcode = RcodeSuccess
|
||||
dns.Question = make([]Question, 1)
|
||||
dns.Question[0] = request.Question[0]
|
||||
}
|
||||
|
||||
// IsReply?
|
||||
|
@ -44,7 +44,7 @@ func (dns *Msg) SetIxfr(z string, serial uint32) {
|
|||
s.Serial = serial
|
||||
|
||||
dns.Question[0] = Question{z, TypeIXFR, ClassINET}
|
||||
dns.Ns[0] = s
|
||||
dns.Ns[0] = s
|
||||
}
|
||||
|
||||
// Create a dns msg suitable for requesting an axfr.
|
||||
|
|
164
dns.go
164
dns.go
|
@ -83,17 +83,17 @@ type Conn struct {
|
|||
// The remote side of the connection.
|
||||
Addr net.Addr
|
||||
|
||||
// The remote port number of the connection.
|
||||
Port int
|
||||
// The remote port number of the connection.
|
||||
Port int
|
||||
|
||||
// If TSIG is used, this holds all the information.
|
||||
Tsig *Tsig
|
||||
// If TSIG is used, this holds all the information.
|
||||
Tsig *Tsig
|
||||
|
||||
// Timeout in sec before giving up on a connection.
|
||||
Timeout int
|
||||
|
||||
// Number of attempts to try to Read/Write from/to a
|
||||
// connection.
|
||||
// connection.
|
||||
Attempts int
|
||||
}
|
||||
|
||||
|
@ -101,48 +101,48 @@ type Conn struct {
|
|||
// TCP the buffer is 64K, with UDP the returned buffer
|
||||
// has a length of 4K bytes.
|
||||
func (d *Conn) NewBuffer() []byte {
|
||||
if d.TCP != nil {
|
||||
b := make([]byte, MaxMsgSize)
|
||||
return b
|
||||
}
|
||||
if d.UDP != nil {
|
||||
b := make([]byte, DefaultMsgSize)
|
||||
return b
|
||||
}
|
||||
return nil
|
||||
if d.TCP != nil {
|
||||
b := make([]byte, MaxMsgSize)
|
||||
return b
|
||||
}
|
||||
if d.UDP != nil {
|
||||
b := make([]byte, DefaultMsgSize)
|
||||
return b
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReadMsg reads a dns message m from d.
|
||||
// Any errors of the underlaying Read call are returned.
|
||||
func (d *Conn) ReadMsg(m *Msg) os.Error {
|
||||
in := d.NewBuffer()
|
||||
n, err := d.Read(in)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
in = in[:n]
|
||||
ok := m.Unpack(in)
|
||||
if !ok {
|
||||
return &Error{Error: "Failed to unpack"}
|
||||
}
|
||||
return nil
|
||||
in := d.NewBuffer()
|
||||
n, err := d.Read(in)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
in = in[:n]
|
||||
ok := m.Unpack(in)
|
||||
if !ok {
|
||||
return &Error{Error: "Failed to unpack"}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// WriteMsg writes dns message m to d.
|
||||
// Any errors of the underlaying Write call are returned.
|
||||
func (d *Conn) WriteMsg(m *Msg) os.Error {
|
||||
out, ok := m.Pack()
|
||||
if !ok {
|
||||
return &Error{Error: "Failed to pack"}
|
||||
}
|
||||
n, err := d.Write(out)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if n != len(out) {
|
||||
return &Error{Error: "Short write"}
|
||||
}
|
||||
return nil
|
||||
out, ok := m.Pack()
|
||||
if !ok {
|
||||
return &Error{Error: "Failed to pack"}
|
||||
}
|
||||
n, err := d.Write(out)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if n != len(out) {
|
||||
return &Error{Error: "Short write"}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read implements the standard Read interface:
|
||||
|
@ -154,23 +154,23 @@ func (d *Conn) Read(p []byte) (n int, err os.Error) {
|
|||
}
|
||||
switch {
|
||||
case d.UDP != nil:
|
||||
var addr net.Addr
|
||||
var addr net.Addr
|
||||
n, addr, err = d.UDP.ReadFromUDP(p)
|
||||
if err != nil {
|
||||
return n, err
|
||||
}
|
||||
d.Addr = addr
|
||||
d.Port = addr.(*net.UDPAddr).Port
|
||||
d.Addr = addr
|
||||
d.Port = addr.(*net.UDPAddr).Port
|
||||
case d.TCP != nil:
|
||||
if len(p) < 1 {
|
||||
return 0, &Error{Error: "Buffer too small to read"}
|
||||
}
|
||||
if len(p) < 1 {
|
||||
return 0, &Error{Error: "Buffer too small to read"}
|
||||
}
|
||||
n, err = d.TCP.Read(p[0:2])
|
||||
if err != nil || n != 2 {
|
||||
return n, err
|
||||
}
|
||||
d.Addr = d.TCP.RemoteAddr()
|
||||
d.Port = d.TCP.RemoteAddr().(*net.TCPAddr).Port
|
||||
d.Addr = d.TCP.RemoteAddr()
|
||||
d.Port = d.TCP.RemoteAddr().(*net.TCPAddr).Port
|
||||
l, _ := unpackUint16(p[0:2], 0)
|
||||
if l == 0 {
|
||||
return 0, &Error{Error: "received nil msg length", Server: d.Addr}
|
||||
|
@ -190,15 +190,15 @@ func (d *Conn) Read(p []byte) (n int, err os.Error) {
|
|||
}
|
||||
i += n
|
||||
}
|
||||
n = i
|
||||
n = i
|
||||
}
|
||||
if d.Tsig != nil {
|
||||
// Check the TSIG that we should be read
|
||||
_, err = d.Tsig.Verify(p)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if d.Tsig != nil {
|
||||
// Check the TSIG that we should be read
|
||||
_, err = d.Tsig.Verify(p)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -211,22 +211,22 @@ func (d *Conn) Write(p []byte) (n int, err os.Error) {
|
|||
}
|
||||
|
||||
var attempts int
|
||||
var q []byte
|
||||
var q []byte
|
||||
if d.Attempts == 0 {
|
||||
attempts = 1
|
||||
} else {
|
||||
attempts = d.Attempts
|
||||
}
|
||||
d.SetTimeout()
|
||||
if d.Tsig != nil {
|
||||
// Create a new buffer with the TSIG added.
|
||||
q, err = d.Tsig.Generate(p)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
} else {
|
||||
q = p
|
||||
}
|
||||
if d.Tsig != nil {
|
||||
// Create a new buffer with the TSIG added.
|
||||
q, err = d.Tsig.Generate(p)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
} else {
|
||||
q = p
|
||||
}
|
||||
|
||||
switch {
|
||||
case d.UDP != nil:
|
||||
|
@ -260,19 +260,19 @@ func (d *Conn) Write(p []byte) (n int, err os.Error) {
|
|||
}
|
||||
return n, err
|
||||
}
|
||||
i := n
|
||||
if i < len(q) {
|
||||
n, err = d.TCP.Write(q)
|
||||
if err != nil {
|
||||
if e, ok := err.(net.Error); ok && e.Timeout() {
|
||||
// We are half way in our write...
|
||||
continue
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
i += n
|
||||
i := n
|
||||
if i < len(q) {
|
||||
n, err = d.TCP.Write(q)
|
||||
if err != nil {
|
||||
if e, ok := err.(net.Error); ok && e.Timeout() {
|
||||
// We are half way in our write...
|
||||
continue
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
i += n
|
||||
}
|
||||
n = i
|
||||
n = i
|
||||
}
|
||||
}
|
||||
return
|
||||
|
@ -319,14 +319,14 @@ func (d *Conn) SetTimeout() (err os.Error) {
|
|||
// If nosend is true, the write is skipped.
|
||||
func (d *Conn) Exchange(request []byte, nosend bool) (reply []byte, err os.Error) {
|
||||
var n int
|
||||
if !nosend {
|
||||
n, err = d.Write(request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if !nosend {
|
||||
n, err = d.Write(request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
// Layer violation to save memory. Its okay then...
|
||||
reply = d.NewBuffer()
|
||||
reply = d.NewBuffer()
|
||||
n, err = d.Read(reply)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
24
dnssec.go
24
dnssec.go
|
@ -32,7 +32,7 @@ const (
|
|||
|
||||
// DNSSEC hashing codes.
|
||||
const (
|
||||
_ = iota
|
||||
_ = iota
|
||||
HashSHA1
|
||||
HashSHA256
|
||||
HashGOST94
|
||||
|
@ -40,9 +40,9 @@ const (
|
|||
|
||||
// DNSKEY flags values.
|
||||
const (
|
||||
KSK = 1
|
||||
ZSK = 1 << 8
|
||||
REVOKE = 1 << 7
|
||||
KSK = 1
|
||||
ZSK = 1 << 8
|
||||
REVOKE = 1 << 7
|
||||
)
|
||||
|
||||
// The RRSIG needs to be converted to wireformat with some of
|
||||
|
@ -105,7 +105,7 @@ func (k *RR_DNSKEY) ToDS(h int) *RR_DS {
|
|||
ds := new(RR_DS)
|
||||
ds.Hdr.Name = k.Hdr.Name
|
||||
ds.Hdr.Class = k.Hdr.Class
|
||||
ds.Hdr.Rrtype = TypeDS
|
||||
ds.Hdr.Rrtype = TypeDS
|
||||
ds.Hdr.Ttl = k.Hdr.Ttl
|
||||
ds.Algorithm = k.Algorithm
|
||||
ds.DigestType = uint8(h)
|
||||
|
@ -342,7 +342,7 @@ func (s *RR_RRSIG) Verify(k *RR_DNSKEY, rrset RRset) bool {
|
|||
}
|
||||
|
||||
// Use RFC1982 to calculate if a signature period is valid.
|
||||
func (s *RR_RRSIG) ValidityPeriod() bool {
|
||||
func (s *RR_RRSIG) ValidityPeriod() bool {
|
||||
utc := time.UTC().Seconds()
|
||||
modi := (int64(s.Inception) - utc) / Year68
|
||||
mode := (int64(s.Expiration) - utc) / Year68
|
||||
|
@ -389,12 +389,12 @@ func (k *RR_DNSKEY) pubKeyRSA() *rsa.PublicKey {
|
|||
|
||||
// Set the public key (the value E and N)
|
||||
func (k *RR_DNSKEY) setPublicKeyRSA(_E int, _N *big.Int) bool {
|
||||
if _E == 0 {
|
||||
return false
|
||||
}
|
||||
if _N == nil {
|
||||
return false
|
||||
}
|
||||
if _E == 0 {
|
||||
return false
|
||||
}
|
||||
if _N == nil {
|
||||
return false
|
||||
}
|
||||
buf := exponentToBuf(_E)
|
||||
buf = append(buf, _N.Bytes()...)
|
||||
k.PublicKey = unpackBase64(buf)
|
||||
|
|
34
resolver.go
34
resolver.go
|
@ -35,7 +35,7 @@ type Resolver struct {
|
|||
|
||||
// Send a query to the nameserver using the res.
|
||||
func (res *Resolver) Query(q *Msg) (d *Msg, err os.Error) {
|
||||
return res.QueryTsig(q, nil)
|
||||
return res.QueryTsig(q, nil)
|
||||
}
|
||||
|
||||
// Send a query to the nameserver using res, but perform TSIG validation.
|
||||
|
@ -52,9 +52,9 @@ func (res *Resolver) QueryTsig(q *Msg, tsig *Tsig) (d *Msg, err os.Error) {
|
|||
if !ok {
|
||||
return nil, &Error{Error: ErrPack}
|
||||
}
|
||||
if res.Mangle != nil {
|
||||
sending = res.Mangle(sending)
|
||||
}
|
||||
if res.Mangle != nil {
|
||||
sending = res.Mangle(sending)
|
||||
}
|
||||
|
||||
for i := 0; i < len(res.Servers); i++ {
|
||||
d := new(Conn)
|
||||
|
@ -62,21 +62,21 @@ func (res *Resolver) QueryTsig(q *Msg, tsig *Tsig) (d *Msg, err os.Error) {
|
|||
t := time.Nanoseconds()
|
||||
if res.Tcp {
|
||||
c, err = net.Dial("tcp", "", server)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
d.TCP = c.(*net.TCPConn)
|
||||
d.Addr = d.TCP.RemoteAddr()
|
||||
} else {
|
||||
c, err = net.Dial("udp", "", server)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
d.UDP = c.(*net.UDPConn)
|
||||
d.Addr = d.UDP.RemoteAddr()
|
||||
}
|
||||
|
||||
d.Tsig = tsig
|
||||
d.Tsig = tsig
|
||||
inb, err = d.Exchange(sending, false)
|
||||
if err != nil {
|
||||
continue
|
||||
|
@ -93,7 +93,7 @@ func (res *Resolver) QueryTsig(q *Msg, tsig *Tsig) (d *Msg, err os.Error) {
|
|||
}
|
||||
|
||||
func (res *Resolver) Xfr(q *Msg, m chan Xfr) {
|
||||
res.XfrTsig(q, nil, m)
|
||||
res.XfrTsig(q, nil, m)
|
||||
}
|
||||
|
||||
func (res *Resolver) XfrTsig(q *Msg, t *Tsig, m chan Xfr) {
|
||||
|
@ -118,11 +118,11 @@ Server:
|
|||
d.Addr = d.TCP.RemoteAddr()
|
||||
d.Tsig = t
|
||||
|
||||
_, err = d.Write(sending)
|
||||
if err != nil {
|
||||
continue Server
|
||||
}
|
||||
d.XfrRead(q, m) // check
|
||||
_, err = d.Write(sending)
|
||||
if err != nil {
|
||||
continue Server
|
||||
}
|
||||
d.XfrRead(q, m) // check
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
40
server.go
40
server.go
|
@ -13,8 +13,8 @@ import (
|
|||
|
||||
// HandleUDP handles one UDP connection. It reads the incoming
|
||||
// message and then calls the function f.
|
||||
// The function f is executed
|
||||
// in a seperate goroutine at which point HandleUDP returns.
|
||||
// The function f is executed in a seperate goroutine at which point
|
||||
// HandleUDP returns.
|
||||
func HandleUDP(l *net.UDPConn, f func(*Conn, *Msg)) os.Error {
|
||||
for {
|
||||
m := make([]byte, DefaultMsgSize)
|
||||
|
@ -24,10 +24,10 @@ func HandleUDP(l *net.UDPConn, f func(*Conn, *Msg)) os.Error {
|
|||
}
|
||||
m = m[:n]
|
||||
|
||||
d := new(Conn)
|
||||
d.UDP = l
|
||||
d.Addr = addr
|
||||
d.Port = addr.Port // Why not the same as in dns.go, line 96
|
||||
d := new(Conn)
|
||||
d.UDP = l
|
||||
d.Addr = addr
|
||||
d.Port = addr.Port
|
||||
|
||||
msg := new(Msg)
|
||||
if !msg.Unpack(m) {
|
||||
|
@ -40,24 +40,24 @@ func HandleUDP(l *net.UDPConn, f func(*Conn, *Msg)) os.Error {
|
|||
|
||||
// HandleTCP handles one TCP connection. It reads the incoming
|
||||
// message and then calls the function f.
|
||||
// The function f is executed
|
||||
// in a seperate goroutine at which point HandleTCP returns.
|
||||
// The function f is executed in a seperate goroutine at which point
|
||||
// HandleTCP returns.
|
||||
func HandleTCP(l *net.TCPListener, f func(*Conn, *Msg)) os.Error {
|
||||
for {
|
||||
c, e := l.AcceptTCP()
|
||||
if e != nil {
|
||||
return e
|
||||
}
|
||||
d := new(Conn)
|
||||
d.TCP = c
|
||||
d.Addr = c.RemoteAddr()
|
||||
d.Port = d.TCP.RemoteAddr().(*net.TCPAddr).Port
|
||||
d := new(Conn)
|
||||
d.TCP = c
|
||||
d.Addr = c.RemoteAddr()
|
||||
d.Port = d.TCP.RemoteAddr().(*net.TCPAddr).Port
|
||||
|
||||
msg := new(Msg)
|
||||
err := d.ReadMsg(msg)
|
||||
err := d.ReadMsg(msg)
|
||||
|
||||
if err != nil {
|
||||
// Logging??
|
||||
// Logging??
|
||||
continue
|
||||
}
|
||||
go f(d, msg)
|
||||
|
@ -69,9 +69,9 @@ func HandleTCP(l *net.TCPListener, f func(*Conn, *Msg)) os.Error {
|
|||
// then calls HandleTCP with f to handle requests on incoming
|
||||
// connections. The function f may not be nil.
|
||||
func ListenAndServeTCP(addr string, f func(*Conn, *Msg)) os.Error {
|
||||
if f == nil {
|
||||
return &Error{Error: "The handle function may not be nil"}
|
||||
}
|
||||
if f == nil {
|
||||
return &Error{Error: "The handle function may not be nil"}
|
||||
}
|
||||
a, err := net.ResolveTCPAddr(addr)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -88,9 +88,9 @@ func ListenAndServeTCP(addr string, f func(*Conn, *Msg)) os.Error {
|
|||
// then calls HandleUDP with f to handle requests on incoming
|
||||
// connections. The function f may not be nil.
|
||||
func ListenAndServeUDP(addr string, f func(*Conn, *Msg)) os.Error {
|
||||
if f == nil {
|
||||
return &Error{Error: "The handle function may not be nil"}
|
||||
}
|
||||
if f == nil {
|
||||
return &Error{Error: "The handle function may not be nil"}
|
||||
}
|
||||
a, err := net.ResolveUDPAddr(addr)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
66
tsig.go
66
tsig.go
|
@ -2,8 +2,8 @@ package dns
|
|||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"time"
|
||||
"os"
|
||||
"time"
|
||||
"strings"
|
||||
"crypto/hmac"
|
||||
"encoding/hex"
|
||||
|
@ -14,13 +14,13 @@ import (
|
|||
// and RFC 4635.
|
||||
type Tsig struct {
|
||||
// The name of the key.
|
||||
Name string
|
||||
// Fudge to take into account.
|
||||
Fudge uint16
|
||||
// When is the TSIG created
|
||||
Name string
|
||||
// Fudge to take into account.
|
||||
Fudge uint16
|
||||
// When is the TSIG created
|
||||
TimeSigned uint64
|
||||
// Which algorithm is used.
|
||||
Algorithm string
|
||||
// Which algorithm is used.
|
||||
Algorithm string
|
||||
// Tsig secret encoded in base64.
|
||||
Secret string
|
||||
// MAC (if known)
|
||||
|
@ -74,12 +74,12 @@ func (t *Tsig) Generate(msg []byte) ([]byte, os.Error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if t.Fudge == 0 {
|
||||
t.Fudge = 300
|
||||
}
|
||||
if t.TimeSigned == 0 {
|
||||
t.TimeSigned = uint64(time.Seconds())
|
||||
}
|
||||
if t.Fudge == 0 {
|
||||
t.Fudge = 300
|
||||
}
|
||||
if t.TimeSigned == 0 {
|
||||
t.TimeSigned = uint64(time.Seconds())
|
||||
}
|
||||
|
||||
buf, err := t.Buffer(msg)
|
||||
if err != nil {
|
||||
|
@ -90,25 +90,25 @@ func (t *Tsig) Generate(msg []byte) ([]byte, os.Error) {
|
|||
t.MAC = hex.EncodeToString(h.Sum()) // Size is half!
|
||||
|
||||
// Create TSIG and add it to the message.
|
||||
q := new(Msg)
|
||||
if !q.Unpack(msg) {
|
||||
return nil, &Error{Error: "Failed to unpack"}
|
||||
}
|
||||
q := new(Msg)
|
||||
if !q.Unpack(msg) {
|
||||
return nil, &Error{Error: "Failed to unpack"}
|
||||
}
|
||||
|
||||
rr := new(RR_TSIG)
|
||||
rr.Hdr = RR_Header{Name: t.Name, Rrtype: TypeTSIG, Class: ClassANY, Ttl: 0}
|
||||
rr.Fudge = t.Fudge
|
||||
rr.TimeSigned = t.TimeSigned
|
||||
rr.Algorithm = t.Algorithm
|
||||
rr.OrigId = q.Id
|
||||
rr.Fudge = t.Fudge
|
||||
rr.TimeSigned = t.TimeSigned
|
||||
rr.Algorithm = t.Algorithm
|
||||
rr.OrigId = q.Id
|
||||
rr.MAC = t.MAC
|
||||
rr.MACSize = uint16(len(t.MAC) / 2)
|
||||
|
||||
q.Extra = append(q.Extra, rr)
|
||||
send, ok := q.Pack()
|
||||
if !ok {
|
||||
return send, &Error{Error: "Failed to pack"}
|
||||
}
|
||||
q.Extra = append(q.Extra, rr)
|
||||
send, ok := q.Pack()
|
||||
if !ok {
|
||||
return send, &Error{Error: "Failed to pack"}
|
||||
}
|
||||
return send, nil
|
||||
}
|
||||
|
||||
|
@ -127,13 +127,13 @@ func (t *Tsig) Verify(msg []byte) (bool, os.Error) {
|
|||
return false, &Error{Error: "Failed to strip tsig"}
|
||||
}
|
||||
|
||||
buf,err := t.Buffer(stripped)
|
||||
buf, err := t.Buffer(stripped)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
// Time needs to be checked */
|
||||
// Generic time error
|
||||
// Time needs to be checked */
|
||||
// Generic time error
|
||||
|
||||
h := hmac.NewMD5([]byte(rawsecret))
|
||||
io.WriteString(h, string(buf))
|
||||
|
@ -154,7 +154,7 @@ func (t *Tsig) Buffer(msg []byte) ([]byte, os.Error) {
|
|||
macbuf = make([]byte, len(t.RequestMAC)) // reqmac should be twice as long
|
||||
n, ok := packStruct(m, macbuf, 0)
|
||||
if !ok {
|
||||
return nil, &Error{Error: "Failed to pack request mac"}
|
||||
return nil, &Error{Error: "Failed to pack request mac"}
|
||||
}
|
||||
macbuf = macbuf[:n]
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ func (t *Tsig) Buffer(msg []byte) ([]byte, os.Error) {
|
|||
tsig.Fudge = t.Fudge
|
||||
n, ok1 := packStruct(tsig, tsigvar, 0)
|
||||
if !ok1 {
|
||||
return nil, &Error{Error: "Failed to pack timers"}
|
||||
return nil, &Error{Error: "Failed to pack timers"}
|
||||
}
|
||||
tsigvar = tsigvar[:n]
|
||||
} else {
|
||||
|
@ -182,7 +182,7 @@ func (t *Tsig) Buffer(msg []byte) ([]byte, os.Error) {
|
|||
tsig.OtherData = ""
|
||||
n, ok1 := packStruct(tsig, tsigvar, 0)
|
||||
if !ok1 {
|
||||
return nil, &Error{Error: "Failed to pack tsig variables"}
|
||||
return nil, &Error{Error: "Failed to pack tsig variables"}
|
||||
}
|
||||
tsigvar = tsigvar[:n]
|
||||
}
|
||||
|
|
22
xfr.go
22
xfr.go
|
@ -19,11 +19,11 @@ type Xfr struct {
|
|||
// section contains an AXFR type an Axfr is performed. If q's question
|
||||
// section contains an IXFR type an Ixfr is performed.
|
||||
func (d *Conn) XfrRead(q *Msg, m chan Xfr) {
|
||||
// Send q first.
|
||||
err := d.WriteMsg(q)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// Send q first.
|
||||
err := d.WriteMsg(q)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
switch q.Question[0].Qtype {
|
||||
case TypeAXFR:
|
||||
d.axfrRead(q, m)
|
||||
|
@ -50,7 +50,7 @@ func (d *Conn) axfrRead(q *Msg, m chan Xfr) {
|
|||
first := true
|
||||
in := new(Msg)
|
||||
for {
|
||||
err := d.ReadMsg(in)
|
||||
err := d.ReadMsg(in)
|
||||
if err != nil {
|
||||
m <- Xfr{true, nil, err}
|
||||
return
|
||||
|
@ -92,8 +92,8 @@ func (d *Conn) axfrWrite(q *Msg, m chan Xfr) {
|
|||
out.Id = q.Id
|
||||
out.Question = q.Question
|
||||
out.Answer = make([]RR, 1001)
|
||||
out.MsgHdr.Response = true
|
||||
out.MsgHdr.Authoritative = true
|
||||
out.MsgHdr.Response = true
|
||||
out.MsgHdr.Authoritative = true
|
||||
var soa *RR_SOA
|
||||
i := 0
|
||||
for r := range m {
|
||||
|
@ -113,14 +113,14 @@ func (d *Conn) axfrWrite(q *Msg, m chan Xfr) {
|
|||
/* ... */
|
||||
}
|
||||
i = 0
|
||||
// Gaat dit goed?
|
||||
// Gaat dit goed?
|
||||
out.Answer = out.Answer[:0]
|
||||
}
|
||||
// TimersOnly foo for TSIG
|
||||
}
|
||||
// Everything is sent, only the closing soa is left.
|
||||
out.Answer[i] = soa
|
||||
out.Answer = out.Answer[:i+1]
|
||||
out.Answer = out.Answer[:i+1]
|
||||
err := d.WriteMsg(out)
|
||||
if err != nil {
|
||||
println(err.String())
|
||||
|
@ -135,7 +135,7 @@ func (d *Conn) ixfrRead(q *Msg, m chan Xfr) {
|
|||
in := new(Msg)
|
||||
for {
|
||||
|
||||
err := d.ReadMsg(in)
|
||||
err := d.ReadMsg(in)
|
||||
if err != nil {
|
||||
m <- Xfr{true, nil, err}
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue