diff --git a/package/luci/files/luci/i18n/smartdns.zh-cn.po b/package/luci/files/luci/i18n/smartdns.zh-cn.po
index 1d03550..567cdf1 100644
--- a/package/luci/files/luci/i18n/smartdns.zh-cn.po
+++ b/package/luci/files/luci/i18n/smartdns.zh-cn.po
@@ -112,6 +112,60 @@ msgstr "设置所有域名的TTL最大值"
msgid "smartdns custom settings"
msgstr "smartdns 自定义设置,具体配置参数参考指导"
+msgid "Second Server Settings"
+msgstr "第二DNS服务器"
+
+msgid "Enable or disable second DNS server."
+msgstr "是否启用第二DNS服务器。"
+
+msgid "Skip Speed Check"
+msgstr "跳过测速"
+
+msgid "Do not check speed."
+msgstr "禁用测速。"
+
+msgid "Server Group"
+msgstr "服务器组"
+
+msgid "Query DNS through specific dns server group, such as office, home."
+msgstr "使用指定服务器组查询,比如office, home。"
+
+msgid "Skip Address Rules"
+msgstr "跳过address规则"
+
+msgid "Skip address rules."
+msgstr "跳过address规则。"
+
+msgid "Skip Nameserver Rule"
+msgstr "跳过Nameserver规则"
+
+msgid "Skip nameserver rules."
+msgstr "跳过Nameserver规则。"
+
+msgid "Skip Ipset Rule"
+msgstr "跳过ipset规则"
+
+msgid "Skip ipset rules."
+msgstr "跳过ipset规则。"
+
+msgid "Skip SOA Address Rule"
+msgstr "跳过address SOA(#)规则"
+
+msgid "Skip SOA address rules."
+msgstr "跳过address SOA(#)规则。"
+
+msgid "Skip Dualstack Selection"
+msgstr "跳过双栈优选"
+
+msgid "Skip Sualstack Selection."
+msgstr "跳过双栈优选。"
+
+msgid "Skip Cache"
+msgstr "跳过cache"
+
+msgid "Skip Cache."
+msgstr "跳过cache。"
+
msgid "Upstream Servers"
msgstr "上游服务器"
@@ -142,8 +196,8 @@ msgstr "域名地址"
msgid "TLS Hostname Verify"
msgstr "校验TLS主机名"
-msgid "Set TLS hostname to verify"
-msgstr "设置校验TLS主机名"
+msgid "Set TLS hostname to verify."
+msgstr "设置校验TLS主机名。"
msgid "TLS SNI name"
msgstr "TLS SNI名称"
@@ -151,8 +205,8 @@ msgstr "TLS SNI名称"
msgid "HTTP Host"
msgstr "HTTP主机"
-msgid "Sets the server name indication"
-msgstr "设置服务器SNI名称"
+msgid "Sets the server name indication for query."
+msgstr "设置查询时使用的服务器SNI名称。"
msgid "Set the HTTP host used for the query. Use this parameter when the host of the URL address is an IP address."
msgstr "设置查询时使用的HTTP主机,当URL地址的host是IP地址时,使用此参数。"
@@ -160,7 +214,7 @@ msgstr "设置查询时使用的HTTP主机,当URL地址的host是IP地址时
msgid "Server Group"
msgstr "服务器组"
-msgid "DNS Server group belongs to, used with nameserver, such as offlce, home."
+msgid "DNS Server group belongs to, used with nameserver, such as office, home."
msgsr "DNS服务器所属组, 配合nameserver使用,例如:office,home。"
msgid "IP Blacklist Filtering"
diff --git a/package/luci/files/luci/model/cbi/smartdns/smartdns.lua b/package/luci/files/luci/model/cbi/smartdns/smartdns.lua
index 5d1a475..79bb815 100644
--- a/package/luci/files/luci/model/cbi/smartdns/smartdns.lua
+++ b/package/luci/files/luci/model/cbi/smartdns/smartdns.lua
@@ -16,6 +16,7 @@ s = m:section(TypedSection, "smartdns", translate("Settings"), translate("Genera
s.anonymous = true
s:tab("settings", translate("General Settings"))
+s:tab("seconddns", translate("Second Server Settings"))
s:tab("custom", translate("Custom Settings"))
---- Eanble
@@ -92,10 +93,92 @@ o.placeholder = "300"
o.default = 300
o.optional = true
+---- second dns server
---- rr-ttl-max
o = s:taboption("settings", Value, "rr_ttl_max", translate("Domain TTL Max"), translate("Maximum TTL for all domain result."))
o.rempty = true
+---- Eanble
+o = s:taboption("seconddns", Flag, "seconddns_enabled", translate("Enable"), translate("Enable or disable second DNS server."))
+o.default = o.disabled
+o.rempty = false
+
+---- Port
+o = s:taboption("seconddns", Value, "seconddns_port", translate("Local Port"), translate("Smartdns local server port"))
+o.placeholder = 7053
+o.default = 7053
+o.datatype = "port"
+o.rempty = false
+
+---- Enable TCP server
+o = s:taboption("seconddns", Flag, "seconddns_tcp_server", translate("TCP Server"), translate("Enable TCP DNS Server"))
+o.rmempty = false
+o.default = o.enabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "1"
+end
+
+o = s:taboption("seconddns", Flag, "seconddns_no_speed_check", translate("Skip Speed Check"), translate("Do not check speed."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+---- dns server group
+o = s:taboption("seconddns", Value, "seconddns_server_group", translate("Server Group"), translate("Query DNS through specific dns server group, such as office, home."))
+o.rmempty = true
+o.placeholder = "default"
+o.datatype = "hostname"
+o.rempty = true
+
+---- skip address rules
+o = s:taboption("seconddns", Flag, "seconddns_no_rule_addr", translate("Skip Address Rules"), translate("Skip address rules."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+---- skip name server rules
+o = s:taboption("seconddns", Flag, "seconddns_no_rule_nameserver", translate("Skip Nameserver Rule"), translate("Skip nameserver rules."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+---- skip ipset rules
+o = s:taboption("seconddns", Flag, "seconddns_no_rule_ipset", translate("Skip Ipset Rule"), translate("Skip ipset rules."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+---- skip soa address rule
+o = s:taboption("seconddns", Flag, "seconddns_no_rule_soa", translate("Skip SOA Address Rule"), translate("Skip SOA address rules."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+o = s:taboption("seconddns", Flag, "seconddns_no_dualstack_selection", translate("Skip Dualstack Selection"), translate("Skip Sualstack Selection."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
+---- skip cache
+o = s:taboption("seconddns", Flag, "seconddns_no_cache", translate("Skip Cache"), translate("Skip Cache."))
+o.rmempty = false
+o.default = o.disabled
+o.cfgvalue = function(...)
+ return Flag.cfgvalue(...) or "0"
+end
+
----- custom settings
custom = s:taboption("custom", Value, "Custom Settings",
translate(""),
diff --git a/package/luci/files/luci/model/cbi/smartdns/upstream.lua b/package/luci/files/luci/model/cbi/smartdns/upstream.lua
index c564eb3..ad5f580 100644
--- a/package/luci/files/luci/model/cbi/smartdns/upstream.lua
+++ b/package/luci/files/luci/model/cbi/smartdns/upstream.lua
@@ -40,7 +40,7 @@ o.default = "udp"
o.rempty = false
---- TLS host verify
-o = s:option(Value, "tls_host_verify", translate("TLS Hostname Verify"), translate("Set TLS hostname to verify"))
+o = s:option(Value, "tls_host_verify", translate("TLS Hostname Verify"), translate("Set TLS hostname to verify."))
o.default = ""
o.datatype = "string"
o.rempty = true
@@ -48,7 +48,7 @@ o:depends("type", "tls")
o:depends("type", "https")
---- SNI host name
-o = s:option(Value, "host_name", translate("TLS SNI name"), translate("Sets the server name indication"))
+o = s:option(Value, "host_name", translate("TLS SNI name"), translate("Sets the server name indication for query."))
o.default = ""
o.datatype = "hostname"
o.rempty = true
@@ -63,7 +63,7 @@ o.rempty = true
o:depends("type", "https")
---- server group
-o = s:option(Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, used with nameserver, such as offlce, home."))
+o = s:option(Value, "server_group", translate("Server Group"), translate("DNS Server group belongs to, used with nameserver, such as office, home."))
o.rmempty = true
o.placeholder = "default"
o.datatype = "hostname"
diff --git a/package/openwrt/files/etc/init.d/smartdns b/package/openwrt/files/etc/init.d/smartdns
index cdacc3b..18aef9a 100644
--- a/package/openwrt/files/etc/init.d/smartdns
+++ b/package/openwrt/files/etc/init.d/smartdns
@@ -233,7 +233,75 @@ load_server()
conf_append "$SERVER" "$DNS_ADDRESS $ADDITIONAL_ARGS $addition_arg"
}
-load_service() {
+load_second_server()
+{
+ local section="$1"
+ local ARGS=""
+ local ADDR=""
+
+ config_get_bool "seconddns_enabled" "$section" "seconddns_enabled" "0"
+ if [ "$seconddns_enabled" = "0" ]; then
+ return
+ fi
+
+ config_get "seconddns_port" "$section" "seconddns_port" "7053"
+
+ config_get_bool "seconddns_no_speed_check" "$section" "seconddns_no_speed_check" "0"
+ if [ "$seconddns_no_speed_check" = "1" ]; then
+ ARGS="$ARGS -no-speed-check"
+ fi
+
+ config_get "seconddns_server_group" "$section" "seconddns_server_group" ""
+ if [ ! -z "$seconddns_server_group" ]; then
+ ARGS="$ARGS -group $seconddns_server_group"
+ fi
+
+ config_get_bool "seconddns_no_rule_addr" "$section" "seconddns_no_rule_addr" "0"
+ if [ "$seconddns_no_rule_addr" = "1" ]; then
+ ARGS="$ARGS -no-rule-addr"
+ fi
+
+ config_get_bool "seconddns_no_rule_nameserver" "$section" "seconddns_no_rule_nameserver" "0"
+ if [ "$seconddns_no_rule_nameserver" = "1" ]; then
+ ARGS="$ARGS -no-rule-nameserver"
+ fi
+
+ config_get_bool "seconddns_no_rule_ipset" "$section" "seconddns_no_rule_ipset" "0"
+ if [ "$seconddns_no_rule_ipset" = "1" ]; then
+ ARGS="$ARGS -no-rule-ipset"
+ fi
+
+ config_get_bool "seconddns_no_rule_soa" "$section" "seconddns_no_rule_soa" "0"
+ if [ "$seconddns_no_rule_soa" = "1" ]; then
+ ARGS="$ARGS -no-rule-soa"
+ fi
+
+ config_get_bool "seconddns_no_dualstack_selection" "$section" "seconddns_no_dualstack_selection" "0"
+ if [ "$seconddns_no_dualstack_selection" = "1" ]; then
+ ARGS="$ARGS -no-dualstack-selection"
+ fi
+
+ config_get_bool "seconddns_no_cache" "$section" "seconddns_no_cache" "0"
+ if [ "$seconddns_no_cache" = "1" ]; then
+ ARGS="$ARGS -no-cache"
+ fi
+
+ config_get "ipv6_server" "$section" "ipv6_server" "1"
+ if [ "$ipv6_server" = "1" ]; then
+ ADDR="[::]"
+ else
+ ADDR=""
+ fi
+
+ conf_append "bind" "$ADDR:$seconddns_port $ARGS"
+ config_get_bool "seconddns_tcp_server" "$section" "seconddns_tcp_server" "1"
+ if [ "$seconddns_tcp_server" = "1" ]; then
+ conf_append "bind-tcp" "$ADDR:$seconddns_port $ARGS"
+ fi
+}
+
+load_service()
+{
local section="$1"
args=""
@@ -352,6 +420,8 @@ load_service() {
set_forward_dnsmasq "$SMARTDNS_PORT"
fi
+ load_second_server $section
+
config_foreach load_server "server"
echo "conf-file $ADDRESS_CONF" >> $SMARTDNS_CONF_TMP
@@ -378,12 +448,14 @@ load_service() {
procd_close_instance
}
-start_service() {
+start_service()
+{
config_load "smartdns"
config_foreach load_service "smartdns"
}
-reload_service(){
+reload_service()
+{
stop
start
}
diff --git a/src/dns_client.c b/src/dns_client.c
index eef7d2d..22d81a9 100644
--- a/src/dns_client.c
+++ b/src/dns_client.c
@@ -16,6 +16,7 @@
* along with this program. If not, see .
*/
+#define _GNU_SOURCE
#include "dns_client.h"
#include "atomic.h"
#include "dns.h"
@@ -45,6 +46,7 @@
#include
#include
#include
+#include
#include
#include
#include
diff --git a/src/dns_conf.c b/src/dns_conf.c
index cbf91f5..0a9b752 100644
--- a/src/dns_conf.c
+++ b/src/dns_conf.c
@@ -745,6 +745,7 @@ static int _config_speed_check_mode(void *data, int argc, char *argv[])
char *ptr;
int order = 0;
int port = 80;
+ int i = 0;
if (argc <= 1) {
return -1;
@@ -778,7 +779,7 @@ static int _config_speed_check_mode(void *data, int argc, char *argv[])
dns_conf_check_order.tcp_port = port;
} else if (strncmp(field, "none", sizeof("none")) == 0) {
dns_conf_check_order.order[order] = DOMAIN_CHECK_NONE;
- for (int i = order + 1; i < DOMAIN_CHECK_NUM; i++) {
+ for (i = order + 1; i < DOMAIN_CHECK_NUM; i++) {
dns_conf_check_order.order[i] = DOMAIN_CHECK_NONE;
}