dnsmasq: add listen_address parameter
[openwrt/openwrt.git] / package / network / services / dnsmasq / files / dnsmasq.init
index d5177ecb0ca652f2f8100bf610885f2fcb386f1b..3d3d83334e0073b1092320a25a553513ca25c3db 100644 (file)
@@ -125,6 +125,10 @@ append_server() {
        xappend "--server=$1"
 }
 
+append_rev_server() {
+        xappend "--rev-server=$1"
+}
+
 append_address() {
        xappend "--address=$1"
 }
@@ -134,12 +138,16 @@ append_ipset() {
 }
 
 append_interface() {
-       network_get_device ifname "$1" || return
+       network_get_device ifname "$1" || ifname="$1"
        xappend "--interface=$ifname"
 }
 
+append_listenaddress() {
+       xappend "--listen-address=$1"
+}
+
 append_notinterface() {
-       network_get_device ifname "$1" || return
+       network_get_device ifname "$1" || ifname="$1"
        xappend "--except-interface=$ifname"
 }
 
@@ -315,7 +323,12 @@ dhcp_host_add() {
        fi
 
        if [ -n "$hostid" ]; then
-                       hex_to_hostid hostid "$hostid"
+               hex_to_hostid hostid "$hostid"
+       fi
+
+       tags=""
+       if [ -n "$tag" ]; then
+               for t in $tag; do append tags "$t" ",set:"; done
        fi
 
        config_get_bool broadcast "$cfg" broadcast 0
@@ -323,7 +336,7 @@ dhcp_host_add() {
 
        [ "$broadcast" = "0" ] && broadcast= || broadcast=",set:needs-broadcast"
 
-       hosttag="${networkid:+,set:${networkid}}${tag:+,set:${tag}}$broadcast"
+       hosttag="${networkid:+,set:${networkid}}${tags:+,set:${tags}}$broadcast"
        nametime="${name:+,$name}${leasetime:+,$leasetime}"
 
        if [ $DNSMASQ_DHCP_VER -eq 6 ]; then
@@ -374,8 +387,8 @@ dhcp_this_host_add() {
                                for lanaddr6 in $lanaddrs6 ; do
                                        case "$lanaddr6" in
                                        "${ulaprefix%%:/*}"*)
-                                                       dhcp_domain_add "" "$routername" "$lanaddr6"
-                                                       ;;
+                                               dhcp_domain_add "" "$routername" "$lanaddr6"
+                                               ;;
                                        esac
                                done
                        fi
@@ -440,6 +453,7 @@ dhcp_add() {
        local cfg="$1"
        local dhcp6range="::"
        local nettag
+       local tags
 
        config_get net "$cfg" interface
        [ -n "$net" ] || return 0
@@ -447,9 +461,7 @@ dhcp_add() {
        config_get networkid "$cfg" networkid
        [ -n "$networkid" ] || networkid="$net"
 
-       network_get_subnet subnet "$net" || return 0
        network_get_device ifname "$net" || return 0
-       network_get_protocol proto "$net" || return 0
 
        [ "$cachelocal" = "0" ] && network_get_dnsserver dnsserver "$net" && {
                DNS_SERVERS="$DNS_SERVERS $dnsserver"
@@ -461,6 +473,9 @@ dhcp_add() {
                return 0
        }
 
+       network_get_subnet subnet "$net" || return 0
+       network_get_protocol proto "$net" || return 0
+
        # Do not support non-static interfaces for now
        [ static = "$proto" ] || return 0
 
@@ -491,6 +506,12 @@ dhcp_add() {
        dhcp_this_host_add "$net" "$ifname" "$ADD_LOCAL_FQDN"
 
        start="$( dhcp_calc "$start" )"
+
+       add_tag() {
+               tags="${tags}tag:$1,"
+       }
+       config_list_foreach "$cfg" tag add_tag
+
        nettag="${networkid:+set:${networkid},}"
 
        if [ "$limit" -gt 0 ] ; then
@@ -508,7 +529,7 @@ dhcp_add() {
 
 
        if [ "$dhcpv4" != "disabled" ] ; then
-               xappend "--dhcp-range=$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}"
+               xappend "--dhcp-range=$tags$nettag$START,$END,$NETMASK,$leasetime${options:+ $options}"
        fi
 
 
@@ -564,7 +585,8 @@ dhcp_add() {
                dhcp_option_append "option6:dns-server,$dnss" "$networkid"
        fi
 
-       dhcp_option_add "$cfg" "$networkid"
+       dhcp_option_add "$cfg" "$networkid" 0
+       dhcp_option_add "$cfg" "$networkid" 2
 }
 
 dhcp_option_append() {
@@ -580,18 +602,20 @@ dhcp_option_add() {
        local cfg="$1"
        local networkid="$2"
        local force="$3"
+       local opt="dhcp_option"
 
        [ "$force" = "0" ] && force=
+       [ "$force" = "2" ] && opt="dhcp_option_force"
 
        local list_len
-       config_get list_len "$cfg" dhcp_option_LENGTH
+       config_get list_len "$cfg" "${opt}_LENGTH"
 
        if [ -n "$list_len" ]; then
-               config_list_foreach "$cfg" dhcp_option dhcp_option_append "$networkid" "$force"
+               config_list_foreach "$cfg" "$opt" dhcp_option_append "$networkid" "$force"
        else
-               config_get dhcp_option "$cfg" dhcp_option
+               config_get dhcp_option "$cfg" "$opt"
 
-               [ -n "$dhcp_option" ] && echo "Warning: the 'option dhcp_option' syntax is deprecated, use 'list dhcp_option'" >&2
+               [ -n "$dhcp_option" ] && echo "Warning: the 'option $opt' syntax is deprecated, use 'list $opt'" >&2
 
                local option
                for option in $dhcp_option; do
@@ -815,7 +839,9 @@ dnsmasq_start()
        append_parm "$cfg" "maxport" "--max-port"
        append_parm "$cfg" "domain" "--domain"
        append_parm "$cfg" "local" "--server"
+       config_list_foreach "$cfg" "listen_address" append_listenaddress
        config_list_foreach "$cfg" "server" append_server
+       config_list_foreach "$cfg" "rev_server" append_rev_server
        config_list_foreach "$cfg" "address" append_address
        config_list_foreach "$cfg" "ipset" append_ipset
        config_list_foreach "$cfg" "interface" append_interface
@@ -908,6 +934,7 @@ dnsmasq_start()
        }
 
        dhcp_option_add "$cfg" "" 0
+       dhcp_option_add "$cfg" "" 2
 
        xappend "--dhcp-broadcast=tag:needs-broadcast"