51 private static final int TIMEOUT = 300000;
52
53 // Resolver options
54 private final Options opts;
55
56 // Parse /etc/resolv.conf to get the values for a particular
57 // keyword.
58 //
59 private LinkedList<String> resolvconf(String keyword,
60 int maxperkeyword,
61 int maxkeywords)
62 {
63 LinkedList<String> ll = new LinkedList<>();
64
65 try {
66 BufferedReader in =
67 new BufferedReader(new FileReader("/etc/resolv.conf"));
68 String line;
69 while ((line = in.readLine()) != null) {
70 int maxvalues = maxperkeyword;
71 if (line.length() == 0)
72 continue;
73 if (line.charAt(0) == '#' || line.charAt(0) == ';')
74 continue;
75 if (!line.startsWith(keyword))
76 continue;
77 String value = line.substring(keyword.length());
78 if (value.length() == 0)
79 continue;
80 if (value.charAt(0) != ' ' && value.charAt(0) != '\t')
81 continue;
82 StringTokenizer st = new StringTokenizer(value, " \t");
83 while (st.hasMoreTokens()) {
84 String val = st.nextToken();
85 if (val.charAt(0) == '#' || val.charAt(0) == ';') {
86 break;
87 }
88 if ("nameserver".equals(keyword)) {
89 if (val.indexOf(':') >= 0 &&
90 val.indexOf('.') < 0 && // skip for IPv4 literals with port
91 val.indexOf('[') < 0 &&
92 val.indexOf(']') < 0 ) {
93 // IPv6 literal, in non-BSD-style.
94 val = "[" + val + "]";
95 }
96 }
97 ll.add(val);
98 if (--maxvalues == 0) {
164 ll = resolvconf("search", 6, 1);
165 if (ll.size() > 0) {
166 return ll;
167 }
168
169 return null;
170
171 } /* run */
172
173 });
174 if (sl != null) {
175 return sl;
176 }
177
178 // No search keyword so use local domain
179
180
181 // LOCALDOMAIN has absolute priority on Solaris
182
183 String localDomain = localDomain0();
184 if (localDomain != null && localDomain.length() > 0) {
185 sl = new LinkedList<>();
186 sl.add(localDomain);
187 return sl;
188 }
189
190 // try domain keyword in /etc/resolv.conf
191
192 sl = java.security.AccessController.doPrivileged(
193 new java.security.PrivilegedAction<>() {
194 public LinkedList<String> run() {
195 LinkedList<String> ll;
196
197 ll = resolvconf("domain", 1, 1);
198 if (ll.size() > 0) {
199 return ll;
200 }
201 return null;
202
203 } /* run */
204 });
205 if (sl != null) {
206 return sl;
207 }
208
209 // no local domain so try fallback (RPC) domain or
210 // hostName
211
212 sl = new LinkedList<>();
213 String domain = fallbackDomain0();
214 if (domain != null && domain.length() > 0) {
215 sl.add(domain);
216 }
217
218 return sl;
219 }
220
221
222 // ----
223
224 ResolverConfigurationImpl() {
225 opts = new OptionsImpl();
226 }
227
228 @SuppressWarnings("unchecked")
229 public List<String> searchlist() {
230 synchronized (lock) {
231 loadConfig();
232
233 // List is mutable so return a shallow copy
234 return (List<String>)searchlist.clone();
|
51 private static final int TIMEOUT = 300000;
52
53 // Resolver options
54 private final Options opts;
55
56 // Parse /etc/resolv.conf to get the values for a particular
57 // keyword.
58 //
59 private LinkedList<String> resolvconf(String keyword,
60 int maxperkeyword,
61 int maxkeywords)
62 {
63 LinkedList<String> ll = new LinkedList<>();
64
65 try {
66 BufferedReader in =
67 new BufferedReader(new FileReader("/etc/resolv.conf"));
68 String line;
69 while ((line = in.readLine()) != null) {
70 int maxvalues = maxperkeyword;
71 if (line.isEmpty())
72 continue;
73 if (line.charAt(0) == '#' || line.charAt(0) == ';')
74 continue;
75 if (!line.startsWith(keyword))
76 continue;
77 String value = line.substring(keyword.length());
78 if (value.isEmpty())
79 continue;
80 if (value.charAt(0) != ' ' && value.charAt(0) != '\t')
81 continue;
82 StringTokenizer st = new StringTokenizer(value, " \t");
83 while (st.hasMoreTokens()) {
84 String val = st.nextToken();
85 if (val.charAt(0) == '#' || val.charAt(0) == ';') {
86 break;
87 }
88 if ("nameserver".equals(keyword)) {
89 if (val.indexOf(':') >= 0 &&
90 val.indexOf('.') < 0 && // skip for IPv4 literals with port
91 val.indexOf('[') < 0 &&
92 val.indexOf(']') < 0 ) {
93 // IPv6 literal, in non-BSD-style.
94 val = "[" + val + "]";
95 }
96 }
97 ll.add(val);
98 if (--maxvalues == 0) {
164 ll = resolvconf("search", 6, 1);
165 if (ll.size() > 0) {
166 return ll;
167 }
168
169 return null;
170
171 } /* run */
172
173 });
174 if (sl != null) {
175 return sl;
176 }
177
178 // No search keyword so use local domain
179
180
181 // LOCALDOMAIN has absolute priority on Solaris
182
183 String localDomain = localDomain0();
184 if (localDomain != null && !localDomain.isEmpty()) {
185 sl = new LinkedList<>();
186 sl.add(localDomain);
187 return sl;
188 }
189
190 // try domain keyword in /etc/resolv.conf
191
192 sl = java.security.AccessController.doPrivileged(
193 new java.security.PrivilegedAction<>() {
194 public LinkedList<String> run() {
195 LinkedList<String> ll;
196
197 ll = resolvconf("domain", 1, 1);
198 if (ll.size() > 0) {
199 return ll;
200 }
201 return null;
202
203 } /* run */
204 });
205 if (sl != null) {
206 return sl;
207 }
208
209 // no local domain so try fallback (RPC) domain or
210 // hostName
211
212 sl = new LinkedList<>();
213 String domain = fallbackDomain0();
214 if (domain != null && !domain.isEmpty()) {
215 sl.add(domain);
216 }
217
218 return sl;
219 }
220
221
222 // ----
223
224 ResolverConfigurationImpl() {
225 opts = new OptionsImpl();
226 }
227
228 @SuppressWarnings("unchecked")
229 public List<String> searchlist() {
230 synchronized (lock) {
231 loadConfig();
232
233 // List is mutable so return a shallow copy
234 return (List<String>)searchlist.clone();
|