all repos

scratch @ c33ca6e

⭐ me doing recreational ~~drugs~~ programming

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
dns: ch4, 1 month ago
1
package main
2
3
import (
4
	"bytes"
5
	"fmt"
6
	"net"
7
)
8
9
func HandleQuery(conn *net.UDPConn) error {
10
	buf := make([]byte, 512)
11
	n, src, err := conn.ReadFromUDP(buf)
12
	if err != nil {
13
		return err
14
	}
15
16
	request, err := ParsePacket(buf[:n])
17
	if err != nil {
18
		return err
19
	}
20
21
	response := Packet{
22
		Header: Header{
23
			ID:                 request.Header.ID,
24
			RecursionDesired:   true,
25
			RecursionAvailable: true,
26
			Response:           true,
27
		},
28
	}
29
30
	if len(request.Questions) == 0 {
31
		response.Header.Rescode = FORMERR
32
	} else {
33
		q := request.Questions[0]
34
		fmt.Printf("Received query: %+v\n", q)
35
36
		res, rerr := Lookup(q.Name, q.Type)
37
		if rerr != nil {
38
			response.Header.Rescode = SERVFAIL
39
		} else {
40
			response.Questions = append(response.Questions, q)
41
			response.Header.Rescode = res.Header.Rescode
42
			for _, rec := range res.Answers {
43
				fmt.Printf("Answer: %+v\n", rec)
44
				response.Answers = append(response.Answers, rec)
45
			}
46
			for _, rec := range res.Authorities {
47
				fmt.Printf("Authority: %+v\n", rec)
48
				response.Authorities = append(response.Authorities, rec)
49
			}
50
			for _, rec := range res.Resources {
51
				fmt.Printf("Resource: %+v\n", rec)
52
				response.Resources = append(response.Resources, rec)
53
			}
54
		}
55
	}
56
57
	resBuf := &bytes.Buffer{}
58
	if err = response.Write(resBuf); err != nil {
59
		return err
60
	}
61
62
	_, err = conn.WriteToUDP(resBuf.Bytes(), src)
63
	return err
64
}