1
2
3
4
5
6
7 package net
8
9 import "os"
10
11 type dnsConfig struct {
12 servers []string
13 search []string
14 ndots int
15 timeout int
16 attempts int
17 rotate bool
18 }
19
20 var dnsconfigError os.Error
21
22 type DNSConfigError struct {
23 Error os.Error
24 }
25
26 func (e *DNSConfigError) String() string {
27 return "error reading DNS config: " + e.Error.String()
28 }
29
30 func (e *DNSConfigError) Timeout() bool { return false }
31 func (e *DNSConfigError) Temporary() bool { return false }
32
33
34
35
36
37 func dnsReadConfig() (*dnsConfig, os.Error) {
38 file, err := open("/etc/resolv.conf")
39 if err != nil {
40 return nil, &DNSConfigError{err}
41 }
42 conf := new(dnsConfig)
43 conf.servers = make([]string, 3)[0:0]
44 conf.search = make([]string, 0)
45 conf.ndots = 1
46 conf.timeout = 5
47 conf.attempts = 2
48 conf.rotate = false
49 for line, ok := file.readLine(); ok; line, ok = file.readLine() {
50 f := getFields(line)
51 if len(f) < 1 {
52 continue
53 }
54 switch f[0] {
55 case "nameserver":
56 a := conf.servers
57 n := len(a)
58 if len(f) > 1 && n < cap(a) {
59
60
61
62 name := f[1]
63 switch len(ParseIP(name)) {
64 case 16:
65 name = "[" + name + "]"
66 fallthrough
67 case 4:
68 a = a[0 : n+1]
69 a[n] = name
70 conf.servers = a
71 }
72 }
73
74 case "domain":
75 if len(f) > 1 {
76 conf.search = make([]string, 1)
77 conf.search[0] = f[1]
78 } else {
79 conf.search = make([]string, 0)
80 }
81
82 case "search":
83 conf.search = make([]string, len(f)-1)
84 for i := 0; i < len(conf.search); i++ {
85 conf.search[i] = f[i+1]
86 }
87
88 case "options":
89 for i := 1; i < len(f); i++ {
90 s := f[i]
91 switch {
92 case len(s) >= 6 && s[0:6] == "ndots:":
93 n, _, _ := dtoi(s, 6)
94 if n < 1 {
95 n = 1
96 }
97 conf.ndots = n
98 case len(s) >= 8 && s[0:8] == "timeout:":
99 n, _, _ := dtoi(s, 8)
100 if n < 1 {
101 n = 1
102 }
103 conf.timeout = n
104 case len(s) >= 8 && s[0:9] == "attempts:":
105 n, _, _ := dtoi(s, 9)
106 if n < 1 {
107 n = 1
108 }
109 conf.attempts = n
110 case s == "rotate":
111 conf.rotate = true
112 }
113 }
114 }
115 }
116 file.close()
117
118 return conf, nil
119 }