>From 12a53657696ecb768ac23bb7b0ce8a2cda4f64f7 Mon Sep 17 00:00:00 2001 From: Eygene Ryabinkin Date: Thu, 24 Apr 2008 13:56:48 +0400 Subject: [PATCH] Some modifications to the new rc.d/resolv code. Following comments by Jeremie Le Hen in the freebsd-current list, http://lists.freebsd.org/pipermail/freebsd-current/2008-April/085077.html I had made the following changes: - the existing forwarders file is never chowned/chmodded, only the new one does; - add_new_bind_forwarders() now accepts empty arguments to create empty forwarders list; it also checks for the empty server names in the list and omits them; - now there is a single place for the creation of the forwarders and resolv files -- at the end of the script; the actual contents of the files are governed by the variables that are set in the respective places; - prepended underscores for the script-global variables to avoid interfering with other global variables; not a strict measure, since there is no policy on variable names. Signed-off-by: Eygene Ryabinkin --- etc/rc.d/resolv | 68 ++++++++++++++++++++++++++++++------------------------- 1 files changed, 37 insertions(+), 31 deletions(-) diff --git a/etc/rc.d/resolv b/etc/rc.d/resolv index e5f9f32..0d42278 100644 --- a/etc/rc.d/resolv +++ b/etc/rc.d/resolv @@ -98,7 +98,7 @@ install_new_file() { rm -f "$1" return 1 else - cp -f "$1" "$2" + cat "$1" > "$2" fi rm -f "$1" @@ -111,68 +111,74 @@ install_new_file() { # Arguments. # $1 - the list of forwarders, separated by ',' or ' '. add_new_bind_forwarders() { - local tmpf + local tmpf existed tmpf="$resolv_named_forwarders_file".new.$$ - [ -z "$1" ] && return checkyesno resolv_build_named_forwarders || return + existed=no + if [ -e "$resolv_named_forwarders_file" ]; then + existed=yes + fi + echo 'forwarders {' > "$tmpf" set -- "$1" for nameserver in `IFS=', '; echo $*`; do - echo "$nameserver;" + [ -n "$nameserver" ] && echo "$nameserver;" done >> "$tmpf" echo '};' >> "$tmpf" # New contents? Try to reload named. if install_new_file "$tmpf" "$resolv_named_forwarders_file"; then - chown -RL root:wheel "$resolv_named_forwarders_file" - chmod -RL 644 "$resolv_named_forwarders_file" + if [ "$existed" = no ]; then + chown -RL root:wheel "$resolv_named_forwarders_file" + chmod -RL 644 "$resolv_named_forwarders_file" + fi named_condreload fi } -tmp_resolv=/etc/resolv.conf.new.$$ -rm -f "$tmp_resolv" +_tmp_resolv=/etc/resolv.conf.new.$$ +rm -f "${_tmp_resolv}" +_nslist="" +_defdomain="" +_mkresolv=no # If user specified static resolv parameters, use them. if [ -n "${resolv_domain}" -o -n "${resolv_nameservers}" ]; then - build_resolv \ - "${resolv_domain}" "${resolv_nameservers}" \ - > "$tmp_resolv" - add_new_bind_forwarders "${resolv_nameservers}" + _nslist="${resolv_nameservers}" + _defdomain="${resolv_domain}" + _mkresolv=yes # dhclient-script calls us using kenv's dhclient.* parameters elif [ -n "`/bin/kenv dhclient.domain-name-servers 2> /dev/null`" -o \ -n "`/bin/kenv dhclient.domain-name 2> /dev/null`" ]; then - build_resolv \ - "`/bin/kenv dhclient.domain-name 2> /dev/null`" \ - "`/bin/kenv dhclient.domain-name-servers`" \ - > "$tmp_resolv" - add_new_bind_forwarders "`/bin/kenv dhclient.domain-name-servers`" + _nslist="`/bin/kenv dhclient.domain-name-servers`" + _defdomain="`/bin/kenv dhclient.domain-name 2> /dev/null`" + _mkresolv=yes # If the info is available via dhcp/kenv (from the boot time) # build the resolv.conf, but only if it is not already exists. # This is the old historical behaviour of /etc/rc.d/resolv. elif [ ! -e /etc/resolv.conf -a \ -n "`/bin/kenv dhcp.domain-name-servers 2> /dev/null`" ]; then - build_resolv \ - "`/bin/kenv dhcp.domain-name 2> /dev/null`" \ - "`/bin/kenv dhcp.domain-name-servers`" > "$tmp_resolv" - add_new_bind_forwarders "`/bin/kenv dhcp.domain-name-servers`" + _nslist="`/bin/kenv dhcp.domain-name-servers`" + _defdomain="`/bin/kenv dhcp.domain-name 2> /dev/null`" + _mkresolv=yes else - # Create forwarders file without forwarding servers. + # Create forwarders file without forwarding servers to clear + # the server list possibly left from the previous invocations. + # Eventually, this creates the file if its creation was requested, + # but no file currently exists. + # # We can not just make it empty, because in the case # of the 'forward only;' directives, named will throw # error about non-existent 'forwarders' clause. - if checkyesno resolv_build_named_forwarders; then - if [ -e "$resolv_named_forwarders_file" ]; then - cat << "EOF" > "$resolv_named_forwarders_file" -forwarders {}; -EOF - named_condreload - fi - fi + _nslist="" fi -install_new_file "$tmp_resolv" /etc/resolv.conf +add_new_bind_forwarders "${_nslist}" +if [ "${_mkresolv}" = yes ]; then + build_resolv "${_defdomain}" "${_nslist}" > "${_tmp_resolv}" + install_new_file "${_tmp_resolv}" /etc/resolv.conf +fi -- 1.5.3.8