dnsmasq: fix dnsmasq startup issue
[openwrt/openwrt.git] / package / network / services / dnsmasq / files / dnsmasq.init
index 2fd56ed4abe6eb13bb3229cf1794f09e181d6880..bb8d07ff354ec5444056b2e645302272ce0fbf8c 100644 (file)
@@ -13,7 +13,6 @@ ADD_LOCAL_FQDN=""
 
 BASECONFIGFILE="/var/etc/dnsmasq.conf"
 BASEHOSTFILE="/tmp/hosts/dhcp"
-BASETIMESTAMPFILE="/etc/dnsmasq.time"
 TRUSTANCHORSFILE="/usr/share/dnsmasq/trust-anchors.conf"
 TIMEVALIDFILE="/var/state/dnsmasqsec"
 BASEDHCPSTAMPFILE="/var/run/dnsmasq"
@@ -295,7 +294,7 @@ dhcp_host_add() {
 
        config_get_bool dns "$cfg" dns 0
        [ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
-               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE
+               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE_TMP
        }
 
        config_get mac "$cfg" mac
@@ -636,7 +635,7 @@ dhcp_domain_add() {
                record="${record:+$record }$name"
        done
 
-       echo "$ip $record" >> $HOSTFILE
+       echo "$ip $record" >> $HOSTFILE_TMP
 }
 
 dhcp_srv_add() {
@@ -742,7 +741,7 @@ dnsmasq_start()
        CONFIGFILE="${BASECONFIGFILE}.${cfg}"
        CONFIGFILE_TMP="${CONFIGFILE}.$$"
        HOSTFILE="${BASEHOSTFILE}.${cfg}"
-       TIMESTAMPFILE="${BASETIMESTAMPFILE}.${cfg}"
+       HOSTFILE_TMP="${HOSTFILE}.$$"
        BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 
        # before we can call xappend
@@ -752,10 +751,8 @@ dnsmasq_start()
        mkdir -p /var/lib/misc
        chown dnsmasq:dnsmasq /var/run/dnsmasq
 
-       [ -f "$TIMESTAMPFILE" ] && rm -f "$TIMESTAMPFILE"
-
        echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE_TMP
-       echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
+       echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE_TMP
 
        local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
        if [ ! -r "$dnsmasqconffile" ]; then
@@ -944,8 +941,9 @@ dnsmasq_start()
        xappend "--addn-hosts=$(dirname $HOSTFILE)"
 
        config_get dnsmasqconfdir "$cfg" confdir "/tmp/dnsmasq.d"
-       [ ! -d "$dnsmasqconfdir" ] && mkdir -p $dnsmasqconfdir
        xappend "--conf-dir=$dnsmasqconfdir"
+       dnsmasqconfdir="${dnsmasqconfdir%%,*}"
+       [ ! -d "$dnsmasqconfdir" ] && mkdir -p $dnsmasqconfdir
        xappend "--user=dnsmasq"
        xappend "--group=dnsmasq"
        echo >> $CONFIGFILE_TMP
@@ -1002,6 +1000,7 @@ dnsmasq_start()
 
        echo >> $CONFIGFILE_TMP
        mv -f $CONFIGFILE_TMP $CONFIGFILE
+       mv -f $HOSTFILE_TMP $HOSTFILE
 
        [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
                rm -f /tmp/resolv.conf
@@ -1029,7 +1028,7 @@ dnsmasq_start()
 
 dnsmasq_stop()
 {
-       local cfg="$1"
+       local cfg="$1" resolvfile
 
        config_get resolvfile "$cfg" "resolvfile"
 
@@ -1044,24 +1043,28 @@ dnsmasq_stop()
        rm -f ${BASEDHCPSTAMPFILE}.${cfg}.*.dhcp
 }
 
-service_triggers()
+add_interface_trigger()
 {
-       procd_add_reload_trigger "dhcp"
-       procd_add_raw_trigger "interface.*" 2000 /etc/init.d/dnsmasq reload
+       local interface ignore
+
+       config_get interface "$1" interface
+       config_get_bool ignore "$1" ignore 0
+
+       [ -n "$interface" -a $ignore -eq 0 ] && procd_add_interface_trigger "interface.*" "$interface" /etc/init.d/dnsmasq reload
 }
 
-boot()
+service_triggers()
 {
-       BOOT=1
-       start "$@"
+       procd_add_reload_trigger "dhcp" "system"
+
+       config_load dhcp
+       config_foreach add_interface_trigger dhcp
 }
 
 start_service() {
        local instance="$1"
        local instance_found=0
 
-       [ -n "$BOOT" ] && return
-
        . /lib/functions/network.sh
 
        config_cb() {
@@ -1086,7 +1089,7 @@ start_service() {
 
 reload_service() {
        rc_procd start_service "$@"
-       return 0
+       procd_send_signal dnsmasq "$@"
 }
 
 stop_service() {