1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.resolver.dns;
17
18 import io.netty.util.internal.BoundedInputStream;
19
20 import java.io.BufferedReader;
21 import java.io.FileInputStream;
22 import java.io.IOException;
23 import java.io.InputStreamReader;
24 import java.net.InetSocketAddress;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28
29
30
31
32 final class ResolvConf {
33 private final List<InetSocketAddress> nameservers;
34
35
36
37
38
39
40
41
42 static ResolvConf fromReader(BufferedReader reader) throws IOException {
43 return new ResolvConf(reader);
44 }
45
46
47
48
49
50 static ResolvConf fromFile(String file) throws IOException {
51
52 try (BufferedReader reader = new BufferedReader(new InputStreamReader(
53 new BoundedInputStream(new FileInputStream(file), 1024 * 1024)))) {
54 return fromReader(reader);
55 }
56 }
57
58
59
60
61
62 static ResolvConf system() {
63 ResolvConf resolvConv = ResolvConfLazy.machineResolvConf;
64 if (resolvConv != null) {
65 return resolvConv;
66 }
67 throw new IllegalStateException("/etc/resolv.conf could not be read");
68 }
69
70 private ResolvConf(BufferedReader reader) throws IOException {
71 List<InetSocketAddress> nameservers = new ArrayList<>();
72 String ln;
73 while ((ln = reader.readLine()) != null) {
74 ln = ln.trim();
75 if (ln.isEmpty()) {
76 continue;
77 }
78
79 if (ln.startsWith("nameserver")) {
80 ln = ln.substring("nameserver".length());
81 int cIndex = ln.indexOf('#');
82 if (cIndex != -1) {
83 ln = ln.substring(0, cIndex);
84 }
85 ln = ln.trim();
86 if (ln.isEmpty()) {
87 continue;
88 }
89 nameservers.add(new InetSocketAddress(ln, 53));
90 }
91 }
92 this.nameservers = Collections.unmodifiableList(nameservers);
93 }
94
95 List<InetSocketAddress> getNameservers() {
96 return nameservers;
97 }
98
99 private static final class ResolvConfLazy {
100 static final ResolvConf machineResolvConf;
101
102 static {
103 ResolvConf resolvConf;
104 try {
105 resolvConf = ResolvConf.fromFile("/etc/resolv.conf");
106 } catch (IOException | SecurityException e) {
107 resolvConf = null;
108 }
109 machineResolvConf = resolvConf;
110 }
111 }
112 }