smartdns.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2023 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #define _GNU_SOURCE
  19. #include "art.h"
  20. #include "atomic.h"
  21. #include "dns_client.h"
  22. #include "dns_conf.h"
  23. #include "dns_server.h"
  24. #include "fast_ping.h"
  25. #include "hashtable.h"
  26. #include "list.h"
  27. #include "rbtree.h"
  28. #include "tlog.h"
  29. #include "util.h"
  30. #include <errno.h>
  31. #include <fcntl.h>
  32. #include <libgen.h>
  33. #include <linux/capability.h>
  34. #include <openssl/err.h>
  35. #include <openssl/ssl.h>
  36. #include <pwd.h>
  37. #include <signal.h>
  38. #include <stdio.h>
  39. #include <stdlib.h>
  40. #include <string.h>
  41. #include <sys/prctl.h>
  42. #include <sys/resource.h>
  43. #include <sys/stat.h>
  44. #include <sys/types.h>
  45. #include <ucontext.h>
  46. #define MAX_KEY_LEN 64
  47. #define SMARTDNS_PID_FILE "/var/run/smartdns.pid"
  48. #define TMP_BUFF_LEN_32 32
  49. static int verbose_screen;
  50. int capget(struct __user_cap_header_struct *header, struct __user_cap_data_struct *cap);
  51. int capset(struct __user_cap_header_struct *header, struct __user_cap_data_struct *cap);
  52. static int get_uid_gid(int *uid, int *gid)
  53. {
  54. struct passwd *result = NULL;
  55. struct passwd pwd;
  56. char *buf = NULL;
  57. ssize_t bufsize = 0;
  58. int ret = -1;
  59. if (dns_conf_user[0] == '\0') {
  60. return -1;
  61. }
  62. bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
  63. if (bufsize == -1) {
  64. bufsize = 1024 * 16;
  65. }
  66. buf = malloc(bufsize);
  67. if (buf == NULL) {
  68. goto out;
  69. }
  70. ret = getpwnam_r(dns_conf_user, &pwd, buf, bufsize, &result);
  71. if (ret != 0) {
  72. goto out;
  73. }
  74. if (result == NULL) {
  75. ret = -1;
  76. goto out;
  77. }
  78. *uid = result->pw_uid;
  79. *gid = result->pw_gid;
  80. out:
  81. if (buf) {
  82. free(buf);
  83. }
  84. return ret;
  85. }
  86. static int drop_root_privilege(void)
  87. {
  88. struct __user_cap_data_struct cap[2];
  89. struct __user_cap_header_struct header;
  90. #ifdef _LINUX_CAPABILITY_VERSION_3
  91. header.version = _LINUX_CAPABILITY_VERSION_3;
  92. #else
  93. header.version = _LINUX_CAPABILITY_VERSION;
  94. #endif
  95. header.pid = 0;
  96. int uid = 0;
  97. int gid = 0;
  98. int unused __attribute__((unused)) = 0;
  99. if (get_uid_gid(&uid, &gid) != 0) {
  100. return -1;
  101. }
  102. memset(cap, 0, sizeof(cap));
  103. if (capget(&header, cap) < 0) {
  104. return -1;
  105. }
  106. prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
  107. for (int i = 0; i < 2; i++) {
  108. cap[i].effective = (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN | 1 << CAP_NET_BIND_SERVICE);
  109. cap[i].permitted = (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN | 1 << CAP_NET_BIND_SERVICE);
  110. }
  111. unused = setgid(gid);
  112. unused = setuid(uid);
  113. if (capset(&header, cap) < 0) {
  114. return -1;
  115. }
  116. prctl(PR_SET_KEEPCAPS, 0, 0, 0, 0);
  117. return 0;
  118. }
  119. static void _help(void)
  120. {
  121. /* clang-format off */
  122. char *help = ""
  123. "Usage: smartdns [OPTION]...\n"
  124. "Start smartdns server.\n"
  125. " -f run foreground.\n"
  126. " -c [conf] config file.\n"
  127. " -p [pid] pid file path, '-' means don't create pid file.\n"
  128. " -S ignore segment fault signal.\n"
  129. " -x verbose screen.\n"
  130. " -v display version.\n"
  131. " -h show this help message.\n"
  132. "Online help: http://pymumu.github.io/smartdns\n"
  133. "Copyright (C) Nick Peng <[email protected]>\n"
  134. ;
  135. /* clang-format on */
  136. printf("%s", help);
  137. }
  138. static void _show_version(void)
  139. {
  140. char str_ver[256] = {0};
  141. #ifdef SMARTDNS_VERION
  142. const char *ver = SMARTDNS_VERION;
  143. snprintf(str_ver, sizeof(str_ver), "%s", ver);
  144. #else
  145. struct tm tm;
  146. get_compiled_time(&tm);
  147. snprintf(str_ver, sizeof(str_ver), "1.%.4d%.2d%.2d-%.2d%.2d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
  148. tm.tm_hour, tm.tm_min);
  149. #endif
  150. printf("smartdns %s\n", str_ver);
  151. }
  152. static int _smartdns_load_from_resolv(void)
  153. {
  154. FILE *fp = NULL;
  155. char line[MAX_LINE_LEN];
  156. char key[MAX_KEY_LEN] = {0};
  157. char value[MAX_LINE_LEN];
  158. char ns_ip[DNS_MAX_IPLEN];
  159. int port = PORT_NOT_DEFINED;
  160. int ret = -1;
  161. int filed_num = 0;
  162. int line_num = 0;
  163. fp = fopen(dns_resolv_file, "r");
  164. if (fp == NULL) {
  165. tlog(TLOG_ERROR, "open %s failed, %s", dns_resolv_file, strerror(errno));
  166. return -1;
  167. }
  168. while (fgets(line, MAX_LINE_LEN, fp)) {
  169. line_num++;
  170. filed_num = sscanf(line, "%63s %1023[^\r\n]s", key, value);
  171. if (filed_num != 2) {
  172. continue;
  173. }
  174. if (strncmp(key, "nameserver", MAX_KEY_LEN - 1) != 0) {
  175. continue;
  176. }
  177. if (parse_ip(value, ns_ip, &port) != 0) {
  178. continue;
  179. }
  180. if (port == PORT_NOT_DEFINED) {
  181. port = DEFAULT_DNS_PORT;
  182. }
  183. safe_strncpy(dns_conf_servers[dns_conf_server_num].server, ns_ip, DNS_MAX_IPLEN);
  184. dns_conf_servers[dns_conf_server_num].port = port;
  185. dns_conf_servers[dns_conf_server_num].type = DNS_SERVER_UDP;
  186. dns_conf_server_num++;
  187. ret = 0;
  188. }
  189. fclose(fp);
  190. return ret;
  191. }
  192. static int _smartdns_add_servers(void)
  193. {
  194. unsigned long i = 0;
  195. int j = 0;
  196. int ret = 0;
  197. struct dns_server_groups *group = NULL;
  198. struct dns_servers *server = NULL;
  199. struct client_dns_server_flags flags;
  200. for (i = 0; i < (unsigned int)dns_conf_server_num; i++) {
  201. memset(&flags, 0, sizeof(flags));
  202. switch (dns_conf_servers[i].type) {
  203. case DNS_SERVER_UDP: {
  204. struct client_dns_server_flag_udp *flag_udp = &flags.udp;
  205. flag_udp->ttl = dns_conf_servers[i].ttl;
  206. } break;
  207. case DNS_SERVER_HTTPS: {
  208. struct client_dns_server_flag_https *flag_http = &flags.https;
  209. flag_http->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_http->spki);
  210. safe_strncpy(flag_http->hostname, dns_conf_servers[i].hostname, sizeof(flag_http->hostname));
  211. safe_strncpy(flag_http->path, dns_conf_servers[i].path, sizeof(flag_http->path));
  212. safe_strncpy(flag_http->httphost, dns_conf_servers[i].httphost, sizeof(flag_http->httphost));
  213. safe_strncpy(flag_http->tls_host_verify, dns_conf_servers[i].tls_host_verify,
  214. sizeof(flag_http->tls_host_verify));
  215. flag_http->skip_check_cert = dns_conf_servers[i].skip_check_cert;
  216. } break;
  217. case DNS_SERVER_TLS: {
  218. struct client_dns_server_flag_tls *flag_tls = &flags.tls;
  219. flag_tls->spi_len = dns_client_spki_decode(dns_conf_servers[i].spki, (unsigned char *)flag_tls->spki);
  220. safe_strncpy(flag_tls->hostname, dns_conf_servers[i].hostname, sizeof(flag_tls->hostname));
  221. safe_strncpy(flag_tls->tls_host_verify, dns_conf_servers[i].tls_host_verify,
  222. sizeof(flag_tls->tls_host_verify));
  223. flag_tls->skip_check_cert = dns_conf_servers[i].skip_check_cert;
  224. } break;
  225. case DNS_SERVER_TCP:
  226. break;
  227. default:
  228. return -1;
  229. break;
  230. }
  231. flags.type = dns_conf_servers[i].type;
  232. flags.server_flag = dns_conf_servers[i].server_flag;
  233. flags.result_flag = dns_conf_servers[i].result_flag;
  234. flags.set_mark = dns_conf_servers[i].set_mark;
  235. safe_strncpy(flags.proxyname, dns_conf_servers[i].proxyname, sizeof(flags.proxyname));
  236. ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type,
  237. &flags);
  238. if (ret != 0) {
  239. tlog(TLOG_ERROR, "add server failed, %s:%d", dns_conf_servers[i].server, dns_conf_servers[i].port);
  240. return -1;
  241. }
  242. }
  243. hash_for_each(dns_group_table.group, i, group, node)
  244. {
  245. ret = dns_client_add_group(group->group_name);
  246. if (ret != 0) {
  247. tlog(TLOG_ERROR, "add group failed, %s", group->group_name);
  248. return -1;
  249. }
  250. for (j = 0; j < group->server_num; j++) {
  251. server = group->servers[j];
  252. if (server == NULL) {
  253. continue;
  254. }
  255. ret = dns_client_add_to_group(group->group_name, server->server, server->port, server->type);
  256. if (ret != 0) {
  257. tlog(TLOG_ERROR, "add server %s to group %s failed", server->server, group->group_name);
  258. return -1;
  259. }
  260. }
  261. }
  262. return 0;
  263. }
  264. static int _proxy_add_servers(void)
  265. {
  266. unsigned long i = 0;
  267. struct hlist_node *tmp = NULL;
  268. struct dns_proxy_names *proxy = NULL;
  269. struct dns_proxy_servers *server = NULL;
  270. struct dns_proxy_servers *server_tmp = NULL;
  271. hash_for_each_safe(dns_proxy_table.proxy, i, tmp, proxy, node)
  272. {
  273. list_for_each_entry_safe(server, server_tmp, &proxy->server_list, list)
  274. {
  275. struct proxy_info info;
  276. memset(&info, 0, sizeof(info));
  277. info.type = server->type;
  278. info.port = server->port;
  279. safe_strncpy(info.server, server->server, PROXY_MAX_IPLEN);
  280. safe_strncpy(info.username, server->username, PROXY_MAX_NAMELEN);
  281. safe_strncpy(info.password, server->password, PROXY_MAX_NAMELEN);
  282. info.use_domain = server->use_domain;
  283. proxy_add(proxy->proxy_name, &info);
  284. }
  285. }
  286. return 0;
  287. }
  288. static int _smartdns_set_ecs_ip(void)
  289. {
  290. int ret = 0;
  291. if (dns_conf_ipv4_ecs.enable) {
  292. ret |= dns_client_set_ecs(dns_conf_ipv4_ecs.ip, dns_conf_ipv4_ecs.subnet);
  293. }
  294. if (dns_conf_ipv6_ecs.enable) {
  295. ret |= dns_client_set_ecs(dns_conf_ipv6_ecs.ip, dns_conf_ipv6_ecs.subnet);
  296. }
  297. return ret;
  298. }
  299. static int _smartdns_init_ssl(void)
  300. {
  301. #if OPENSSL_API_COMPAT < 0x10100000L
  302. SSL_load_error_strings();
  303. SSL_library_init();
  304. OpenSSL_add_all_algorithms();
  305. SSL_CRYPTO_thread_setup();
  306. #endif
  307. return 0;
  308. }
  309. static int _smartdns_destroy_ssl(void)
  310. {
  311. #if OPENSSL_API_COMPAT < 0x10100000L
  312. SSL_CRYPTO_thread_cleanup();
  313. ERR_free_strings();
  314. EVP_cleanup();
  315. #endif
  316. return 0;
  317. }
  318. static const char *_smartdns_log_path(void)
  319. {
  320. char *logfile = SMARTDNS_LOG_FILE;
  321. if (dns_conf_log_file[0] != 0) {
  322. logfile = dns_conf_log_file;
  323. }
  324. return logfile;
  325. }
  326. static int _smartdns_init(void)
  327. {
  328. int ret = 0;
  329. const char *logfile = _smartdns_log_path();
  330. int i = 0;
  331. ret = tlog_init(logfile, dns_conf_log_size, dns_conf_log_num, 0, 0);
  332. if (ret != 0) {
  333. tlog(TLOG_ERROR, "start tlog failed.\n");
  334. goto errout;
  335. }
  336. tlog_setlogscreen(verbose_screen);
  337. tlog_setlevel(dns_conf_log_level);
  338. if (dns_conf_log_file_mode > 0) {
  339. tlog_set_permission(tlog_get_root(), dns_conf_log_file_mode, dns_conf_log_file_mode);
  340. }
  341. tlog(TLOG_NOTICE, "smartdns starting...(Copyright (C) Nick Peng <[email protected]>, build: %s %s)", __DATE__,
  342. __TIME__);
  343. if (_smartdns_init_ssl() != 0) {
  344. tlog(TLOG_ERROR, "init ssl failed.");
  345. goto errout;
  346. }
  347. for (i = 0; i < 60 && dns_conf_server_num <= 0; i++) {
  348. ret = _smartdns_load_from_resolv();
  349. if (ret == 0) {
  350. continue;
  351. }
  352. tlog(TLOG_DEBUG, "load dns from resolv failed, retry after 1s, retry times %d.", i + 1);
  353. sleep(1);
  354. }
  355. if (dns_conf_server_num <= 0) {
  356. tlog(TLOG_ERROR, "no dns server found, exit...");
  357. goto errout;
  358. }
  359. ret = fast_ping_init();
  360. if (ret != 0) {
  361. tlog(TLOG_ERROR, "start ping failed.\n");
  362. goto errout;
  363. }
  364. ret = proxy_init();
  365. if (ret != 0) {
  366. tlog(TLOG_ERROR, "start proxy failed.\n");
  367. goto errout;
  368. }
  369. ret = _proxy_add_servers();
  370. if (ret != 0) {
  371. tlog(TLOG_ERROR, "add proxy servers failed.");
  372. }
  373. ret = dns_server_init();
  374. if (ret != 0) {
  375. tlog(TLOG_ERROR, "start dns server failed.\n");
  376. goto errout;
  377. }
  378. ret = dns_client_init();
  379. if (ret != 0) {
  380. tlog(TLOG_ERROR, "start dns client failed.\n");
  381. goto errout;
  382. }
  383. ret = _smartdns_add_servers();
  384. if (ret != 0) {
  385. tlog(TLOG_ERROR, "add servers failed.");
  386. goto errout;
  387. }
  388. ret = _smartdns_set_ecs_ip();
  389. if (ret != 0) {
  390. tlog(TLOG_WARN, "set ecs ip address failed.");
  391. }
  392. return 0;
  393. errout:
  394. return -1;
  395. }
  396. static int _smartdns_run(void)
  397. {
  398. return dns_server_run();
  399. }
  400. static void _smartdns_exit(void)
  401. {
  402. tlog(TLOG_INFO, "smartdns exit...");
  403. dns_client_exit();
  404. proxy_exit();
  405. fast_ping_exit();
  406. dns_server_exit();
  407. _smartdns_destroy_ssl();
  408. tlog_exit();
  409. dns_server_load_exit();
  410. }
  411. static void _sig_exit(int signo)
  412. {
  413. tlog(TLOG_INFO, "stop smartdns by signal %d", signo);
  414. dns_server_stop();
  415. }
  416. static void _sig_error_exit(int signo, siginfo_t *siginfo, void *ct)
  417. {
  418. unsigned long PC = 0;
  419. ucontext_t *context = ct;
  420. const char *arch = NULL;
  421. #if defined(__i386__)
  422. int *pgregs = (int *)(&(context->uc_mcontext.gregs));
  423. PC = pgregs[REG_EIP];
  424. arch = "i386";
  425. #elif defined(__x86_64__)
  426. int *pgregs = (int *)(&(context->uc_mcontext.gregs));
  427. PC = pgregs[REG_RIP];
  428. arch = "x86_64";
  429. #elif defined(__arm__)
  430. PC = context->uc_mcontext.arm_pc;
  431. arch = "arm";
  432. #elif defined(__aarch64__)
  433. PC = context->uc_mcontext.pc;
  434. arch = "arm64";
  435. #elif defined(__mips__)
  436. PC = context->uc_mcontext.pc;
  437. arch = "mips";
  438. #endif
  439. tlog(TLOG_FATAL,
  440. "process exit with signal %d, code = %d, errno = %d, pid = %d, self = %d, pc = %#lx, addr = %#lx, build(%s "
  441. "%s %s)\n",
  442. signo, siginfo->si_code, siginfo->si_errno, siginfo->si_pid, getpid(), PC, (unsigned long)siginfo->si_addr,
  443. __DATE__, __TIME__, arch);
  444. print_stack();
  445. sleep(1);
  446. _exit(0);
  447. }
  448. static int sig_list[] = {SIGSEGV, SIGABRT, SIGBUS, SIGILL, SIGFPE};
  449. static int sig_num = sizeof(sig_list) / sizeof(int);
  450. static void _reg_signal(void)
  451. {
  452. struct sigaction act;
  453. struct sigaction old;
  454. int i = 0;
  455. act.sa_sigaction = _sig_error_exit;
  456. sigemptyset(&act.sa_mask);
  457. act.sa_flags = SA_RESTART | SA_SIGINFO;
  458. for (i = 0; i < sig_num; i++) {
  459. sigaction(sig_list[i], &act, &old);
  460. }
  461. }
  462. static int _smartdns_create_logdir(void)
  463. {
  464. int uid = 0;
  465. int gid = 0;
  466. char logdir[PATH_MAX] = {0};
  467. safe_strncpy(logdir, _smartdns_log_path(), PATH_MAX);
  468. dirname(logdir);
  469. if (access(logdir, F_OK) == 0) {
  470. return 0;
  471. }
  472. if (mkdir(logdir, 0750) != 0) {
  473. if (errno == EEXIST) {
  474. return 0;
  475. }
  476. return -1;
  477. }
  478. int unused __attribute__((unused)) = 0;
  479. if (get_uid_gid(&uid, &gid) != 0) {
  480. return -1;
  481. }
  482. unused = chown(logdir, uid, gid);
  483. return 0;
  484. }
  485. static int _set_rlimit(void)
  486. {
  487. struct rlimit value;
  488. value.rlim_cur = 40;
  489. value.rlim_max = 40;
  490. setrlimit(RLIMIT_NICE, &value);
  491. return 0;
  492. }
  493. static int _smartdns_init_pre(void)
  494. {
  495. _smartdns_create_logdir();
  496. _set_rlimit();
  497. return 0;
  498. }
  499. int main(int argc, char *argv[])
  500. {
  501. int ret = 0;
  502. int is_foreground = 0;
  503. int opt = 0;
  504. char config_file[MAX_LINE_LEN];
  505. char pid_file[MAX_LINE_LEN];
  506. int signal_ignore = 0;
  507. sigset_t empty_sigblock;
  508. safe_strncpy(config_file, SMARTDNS_CONF_FILE, MAX_LINE_LEN);
  509. safe_strncpy(pid_file, SMARTDNS_PID_FILE, MAX_LINE_LEN);
  510. /* patch for Asus router: unblock all signal*/
  511. sigemptyset(&empty_sigblock);
  512. sigprocmask(SIG_SETMASK, &empty_sigblock, NULL);
  513. while ((opt = getopt(argc, argv, "fhc:p:SvxN:")) != -1) {
  514. switch (opt) {
  515. case 'f':
  516. is_foreground = 1;
  517. break;
  518. case 'c':
  519. snprintf(config_file, sizeof(config_file), "%s", optarg);
  520. break;
  521. case 'p':
  522. snprintf(pid_file, sizeof(pid_file), "%s", optarg);
  523. break;
  524. case 'S':
  525. signal_ignore = 1;
  526. break;
  527. case 'x':
  528. verbose_screen = 1;
  529. break;
  530. case 'v':
  531. _show_version();
  532. return 0;
  533. break;
  534. #ifdef DEBUG
  535. case 'N':
  536. return dns_packet_debug(optarg);
  537. #endif
  538. case 'h':
  539. _help();
  540. return 1;
  541. }
  542. }
  543. if (dns_server_load_conf(config_file) != 0) {
  544. fprintf(stderr, "load config failed.\n");
  545. goto errout;
  546. }
  547. if (is_foreground == 0) {
  548. if (daemon(0, 0) < 0) {
  549. fprintf(stderr, "run daemon process failed, %s\n", strerror(errno));
  550. return 1;
  551. }
  552. }
  553. if (signal_ignore == 0) {
  554. _reg_signal();
  555. }
  556. if (strncmp(pid_file, "-", 2) != 0 && create_pid_file(pid_file) != 0) {
  557. goto errout;
  558. }
  559. signal(SIGPIPE, SIG_IGN);
  560. signal(SIGINT, _sig_exit);
  561. signal(SIGTERM, _sig_exit);
  562. if (_smartdns_init_pre() != 0) {
  563. fprintf(stderr, "init failed.\n");
  564. return 1;
  565. }
  566. drop_root_privilege();
  567. ret = _smartdns_init();
  568. if (ret != 0) {
  569. usleep(100000);
  570. goto errout;
  571. }
  572. atexit(_smartdns_exit);
  573. return _smartdns_run();
  574. errout:
  575. return 1;
  576. }