--- a/debian/scripts/dhcp6c-script 2016-09-04 17:12:35.405042056 -0700 +++ b/debian/scripts/dhcp6c-script 2016-09-05 03:00:05.737812217 -0700 @@ -6,20 +6,47 @@ [ -f /etc/default/wide-dhcpv6-client ] && . /etc/default/wide-dhcpv6-client +# Guess interface to use as link local scope if not provided in +# $ifname environment variable. +if [ -z "$ifname" ]; then + for IFACE in $INTERFACES; do + ifname="$IFACE" + break; + done +fi + +# exact line match. grep would interpret domain periods as special +# chars. The naive loop avoids relying on other non-coreutils +# commands (sed, awk, etc.). +has_line () { + local line + while read line; do + if [ "$line" = "$1" ]; then + return 0 + fi + done + return 1 +} + if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then old_resolv_conf=/etc/resolv.conf new_resolv_conf=/etc/resolv.conf.dhcp6c-new rm -f $new_resolv_conf if [ -n "$new_domain_name" ]; then - echo search $new_domain_name >> $new_resolv_conf + has_line "search $new_domain_name" < $old_resolv_conf || { + echo "search $new_domain_name" >> $new_resolv_conf + } fi if [ -n "$new_domain_name_servers" ]; then for nameserver in $new_domain_name_servers; do + if [ -n "$ifname" -a "${nameserver##fe80::}" != "$nameserver" ]; then + nameserver="$nameserver%$ifname" + fi + # No need to add an already existing nameserver - res=$(grep "nameserver $nameserver" $old_resolv_conf) - if [ -z "$res" ]; then - echo nameserver $nameserver >> $new_resolv_conf - fi + has_line "nameserver $nameserver" < $old_resolv_conf || { + echo "nameserver $nameserver" >> $new_resolv_conf + } done fi