all repos

scratch @ 77539dbab7c4667298a1184973b0ad6c0819c0bb

⭐ 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
	// TODO: don't do int(Questions) ????
25
	for i := 0; i < int(p.Header.Questions); i++ {
26
		q, err := ReadQuestion(r, packet)
27
		if err != nil {
28
			return Packet{}, err
29
		}
30
		p.Questions = append(p.Questions, q)
31
	}
32
33
	for i := 0; i < int(p.Header.Answers); i++ {
34
		a, err := ReadRecord(r, packet)
35
		if err != nil {
36
			return Packet{}, err
37
		}
38
		p.Answers = append(p.Answers, a)
39
	}
40
41
	for i := 0; i < int(p.Header.AuthoritativeEntries); i++ {
42
		ae, err := ReadRecord(r, packet)
43
		if err != nil {
44
			return Packet{}, err
45
		}
46
		p.Authorities = append(p.Authorities, ae)
47
	}
48
49
	for i := 0; i < int(p.Header.ResourceEntries); i++ {
50
		re, err := ReadRecord(r, packet)
51
		if err != nil {
52
			return Packet{}, err
53
		}
54
		p.Resources = append(p.Resources, re)
55
	}
56
57
	return p, nil
58
}