all repos

scratch @ master

⭐ me doing recreational ~~drugs~~ programming

scratch/dns-server/packet.go (view raw)

1
package main
2
3
import "bytes"
4
5
type Packet struct {
6
	Header      Header
7
	Questions   []Question
8
	Answers     []Record
9
	Authorities []Record
10
	Resources   []Record
11
}
12
13
func ParsePacket(packet []byte) (Packet, error) {
14
	r := bytes.NewReader(packet)
15
16
	var err error
17
	var p Packet
18
19
	p.Header, err = ReadHeader(r)
20
	if err != nil {
21
		return Packet{}, err
22
	}
23
24
	for i := 0; i < int(p.Header.Questions); i++ {
25
		q, err := ReadQuestion(r, packet)
26
		if err != nil {
27
			return Packet{}, err
28
		}
29
		p.Questions = append(p.Questions, q)
30
	}
31
32
	for i := 0; i < int(p.Header.Answers); i++ {
33
		a, err := ReadRecord(r, packet)
34
		if err != nil {
35
			return Packet{}, err
36
		}
37
		p.Answers = append(p.Answers, a)
38
	}
39
40
	for i := 0; i < int(p.Header.AuthoritativeEntries); i++ {
41
		ae, err := ReadRecord(r, packet)
42
		if err != nil {
43
			return Packet{}, err
44
		}
45
		p.Authorities = append(p.Authorities, ae)
46
	}
47
48
	for i := 0; i < int(p.Header.ResourceEntries); i++ {
49
		re, err := ReadRecord(r, packet)
50
		if err != nil {
51
			return Packet{}, err
52
		}
53
		p.Resources = append(p.Resources, re)
54
	}
55
56
	return p, nil
57
}
58
59
func (p *Packet) Write(b *bytes.Buffer) error {
60
	p.Header.Questions = uint16(len(p.Questions))
61
	p.Header.Answers = uint16(len(p.Answers))
62
	p.Header.AuthoritativeEntries = uint16(len(p.Authorities))
63
	p.Header.ResourceEntries = uint16(len(p.Resources))
64
	_ = p.Header.Write(b)
65
66
	for i := range p.Questions {
67
		_ = p.Questions[i].Write(b)
68
	}
69
70
	for i := range p.Answers {
71
		_, _ = p.Answers[i].Write(b)
72
	}
73
74
	for i := range p.Authorities {
75
		_, _ = p.Authorities[i].Write(b)
76
	}
77
78
	for i := range p.Resources {
79
		_, _ = p.Resources[i].Write(b)
80
	}
81
82
	return nil
83
}