freebsd-dev/contrib/openresolv/libc.in
2011-09-13 02:46:22 +00:00

171 lines
4.9 KiB
Bash

#!/bin/sh
# Copyright (c) 2007-2009 Roy Marples
# All rights reserved
# libc subscriber for resolvconf
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SYSCONFDIR=@SYSCONFDIR@
LIBEXECDIR=@LIBEXECDIR@
VARDIR=@VARDIR@
IFACEDIR="$VARDIR/interfaces"
NL="
"
# sed may not be available, and this is faster on small files
key_get_value()
{
local key="$1" value= x= line=
shift
if [ $# -eq 0 ]; then
while read line; do
case "$line" in
"$key"*) echo "${line##$key}";;
esac
done
else
for x; do
while read line; do
case "$line" in
"$key"*) echo "${line##$key}";;
esac
done < "$x"
done
fi
}
# Support original resolvconf configuration layout
# as well as the openresolv config file
if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then
. "$SYSCONFDIR"/resolvconf.conf
elif [ -d "$SYSCONFDIR"/resolvconf ]; then
SYSCONFDIR="$SYSCONFDIR/resolvconf/resolv.conf.d"
base="$SYSCONFDIR/resolv.conf.d/base"
if [ -f "$base" ]; then
name_servers="$(key_get_value "nameserver " "$base")"
search_domains="$(key_get_value "search " "$base")"
if [ -z "$search_domains" ]; then
search_domains="$(key_get_value "domain " "$base")"
fi
resolv_conf_options="$(key_get_value "options " "$base")"
fi
if [ -f "$SYSCONFDIR"/resolv.conf.d/head ]; then
resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.d/head)"
fi
if [ -f "$SYSCONFDIR"/resolv.conf.d/tail ]; then
resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.d/tail)"
fi
fi
: ${resolv_conf:=/etc/resolv.conf}
: ${libc_service:=nscd}
: ${libc_restart:=@RESTARTCMD ${libc_service}@}
: ${list_resolv:=@PREFIX@/sbin/resolvconf -l}
if [ "${resolv_conf_head-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.head ]; then
resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.head)"
fi
if [ "${resolv_conf_tail-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.tail ]; then
resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.tail)"
fi
uniqify()
{
local result=
while [ -n "$1" ]; do
case " $result " in
*" $1 "*);;
*) result="$result $1";;
esac
shift
done
echo "${result# *}"
}
case "${resolv_conf_passthrough:-NO}" in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
newest=
for conf in "$IFACEDIR"/*; do
if [ -z "$newest" -o "$conf" -nt "$newest" ]; then
newest="$conf"
fi
done
[ -z "$newest" ] && exit 0
newconf="$(cat "$newest")$NL"
;;
*)
[ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)"
newsearch="$(uniqify $search_domains $SEARCH $search_domains_append)"
NS="$LOCALNAMESERVERS $NAMESERVERS"
newns="$(uniqify $name_servers $NS $name_servers_append)"
# Hold our new resolv.conf in a variable to save on temporary files
newconf="# Generated by resolvconf$NL"
if [ -n "$resolv_conf_head" ]; then
newconf="$newconf$resolv_conf_head$NL"
fi
[ -n "$newsearch" ] && newconf="${newconf}search $newsearch$NL"
for n in $newns; do
newconf="${newconf}nameserver $n$NL"
done
# Now get any configured options
opts="$resolv_conf_options${resolv_conf_options:+ }"
opts="$opts$($list_resolv | key_get_value "options ")"
if [ -n "$opts" ]; then
newconf="${newconf}options"
for opt in $(uniqify $opts); do
newconf="${newconf} $opt"
done
newconf="$newconf$NL"
fi
if [ -n "$resolv_conf_tail" ]; then
newconf="$newconf$resolv_conf_tail$NL"
fi
;;
esac
# Check if the file has actually changed or not
if [ -e "$resolv_conf" ]; then
[ "$(cat "$resolv_conf")" = "$(printf %s "$newconf")" ] && exit 0
fi
# Create our resolv.conf now
(umask 022; echo "$newconf" >"$resolv_conf")
eval $libc_restart
retval=0
# Notify users of the resolver
for script in "$LIBEXECDIR"/libc.d/*; do
if [ -f "$script" ]; then
if [ -x "$script" ]; then
"$script" "$@"
else
(. "$script" "$@")
fi
retval=$(($retval + $?))
fi
done
exit $retval