/contrib/openresolv/libc.in
https://bitbucket.org/freebsd/freebsd-head/ · Autoconf · 170 lines · 123 code · 14 blank · 33 comment · 27 complexity · 747c42bc25f9315e3e28cc49ed410893 MD5 · raw file
- #!/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