Formatting

This commit is contained in:
Miek Gieben 2011-03-24 09:24:24 +01:00
parent 93a7feb0a7
commit f44bf2d656
8 changed files with 184 additions and 184 deletions

View File

@ -90,7 +90,7 @@ func (r *Resolver) FromFile(conf string) os.Error {
}
r.Attempts = n
case s == "rotate":
/* not imp */
/* not imp */
}
}
}

View File

@ -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
View File

@ -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

View File

@ -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)

View File

@ -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
}

View File

@ -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
View File

@ -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
View File

@ -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