1 /*
2 * libwebsockets - small server side websockets and web server implementation
3 *
4 * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
23 */
24
25 #include "private-lib-core.h"
26
27 lws_async_dns_server_check_t
lws_plat_asyncdns_init(struct lws_context * context,lws_sockaddr46 * sa46)28 lws_plat_asyncdns_init(struct lws_context *context, lws_sockaddr46 *sa46)
29 {
30 lws_async_dns_server_check_t s = LADNS_CONF_SERVER_CHANGED;
31 char resolv[512], ads[48];
32 lws_sockaddr46 sa46t;
33 lws_tokenize_t ts;
34 int fd, n, ns = 0;
35
36 /* grab the first chunk of /etc/resolv.conf */
37
38 fd = open("/etc/resolv.conf", LWS_O_RDONLY);
39 if (fd < 0)
40 return LADNS_CONF_SERVER_UNKNOWN;
41
42 n = read(fd, resolv, sizeof(resolv) - 1);
43 close(fd);
44 if (n < 0)
45 return LADNS_CONF_SERVER_UNKNOWN;
46
47 resolv[n] = '\0';
48 lws_tokenize_init(&ts, resolv, LWS_TOKENIZE_F_DOT_NONTERM |
49 LWS_TOKENIZE_F_NO_FLOATS |
50 LWS_TOKENIZE_F_NO_INTEGERS |
51 LWS_TOKENIZE_F_MINUS_NONTERM |
52 LWS_TOKENIZE_F_HASH_COMMENT);
53 do {
54 ts.e = lws_tokenize(&ts);
55 if (ts.e != LWS_TOKZE_TOKEN) {
56 ns = 0;
57 continue;
58 }
59
60 if (!ns && !strncmp("nameserver", ts.token, ts.token_len)) {
61 ns = 1;
62 continue;
63 }
64 if (!ns)
65 continue;
66
67 /* we are a token just after the "nameserver" token */
68
69 ns = 0;
70 if (ts.token_len > (int)sizeof(ads) - 1)
71 continue;
72
73 memcpy(ads, ts.token, ts.token_len);
74 ads[ts.token_len] = '\0';
75 if (lws_sa46_parse_numeric_address(ads, &sa46t) < 0)
76 continue;
77
78 if (!lws_sa46_compare_ads(sa46, &sa46t))
79 s = LADNS_CONF_SERVER_SAME;
80
81 *sa46 = sa46t;
82
83 return s;
84
85 } while (ts.e > 0);
86
87 return LADNS_CONF_SERVER_UNKNOWN;
88 }
89