xref: /freebsd/contrib/openresolv/resolvconf.in (revision 587392a5a04955b85c3beac4cff26ca568359f54)
1*587392a5SHajimu UMEMOTO#!/bin/sh
2*587392a5SHajimu UMEMOTO# Copyright (c) 2007-2009 Roy Marples
3*587392a5SHajimu UMEMOTO# All rights reserved
4*587392a5SHajimu UMEMOTO
5*587392a5SHajimu UMEMOTO# Redistribution and use in source and binary forms, with or without
6*587392a5SHajimu UMEMOTO# modification, are permitted provided that the following conditions
7*587392a5SHajimu UMEMOTO# are met:
8*587392a5SHajimu UMEMOTO#     * Redistributions of source code must retain the above copyright
9*587392a5SHajimu UMEMOTO#       notice, this list of conditions and the following disclaimer.
10*587392a5SHajimu UMEMOTO#     * Redistributions in binary form must reproduce the above
11*587392a5SHajimu UMEMOTO#       copyright notice, this list of conditions and the following
12*587392a5SHajimu UMEMOTO#       disclaimer in the documentation and/or other materials provided
13*587392a5SHajimu UMEMOTO#       with the distribution.
14*587392a5SHajimu UMEMOTO#
15*587392a5SHajimu UMEMOTO# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*587392a5SHajimu UMEMOTO# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*587392a5SHajimu UMEMOTO# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*587392a5SHajimu UMEMOTO# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19*587392a5SHajimu UMEMOTO# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20*587392a5SHajimu UMEMOTO# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21*587392a5SHajimu UMEMOTO# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*587392a5SHajimu UMEMOTO# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*587392a5SHajimu UMEMOTO# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*587392a5SHajimu UMEMOTO# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25*587392a5SHajimu UMEMOTO# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*587392a5SHajimu UMEMOTO
27*587392a5SHajimu UMEMOTORESOLVCONF="$0"
28*587392a5SHajimu UMEMOTOSYSCONFDIR=@SYSCONFDIR@
29*587392a5SHajimu UMEMOTOLIBEXECDIR=@LIBEXECDIR@
30*587392a5SHajimu UMEMOTOVARDIR=@VARDIR@
31*587392a5SHajimu UMEMOTO# Support original resolvconf configuration layout
32*587392a5SHajimu UMEMOTO# as well as the openresolv config file
33*587392a5SHajimu UMEMOTOif [ -f "$SYSCONFDIR"/resolvconf.conf ]; then
34*587392a5SHajimu UMEMOTO	. "$SYSCONFDIR"/resolvconf.conf
35*587392a5SHajimu UMEMOTO	[ -n "$state_dir" ] && VARDIR="$state_dir"
36*587392a5SHajimu UMEMOTOelif [ -d "$SYSCONFDIR/resolvconf" ]; then
37*587392a5SHajimu UMEMOTO	SYSCONFDIR="$SYSCONFDIR/resolvconf"
38*587392a5SHajimu UMEMOTO	if [ -f "$SYSCONFDIR"/interface-order ]; then
39*587392a5SHajimu UMEMOTO		interface_order="$(cat "$SYSCONFDIR"/interface-order)"
40*587392a5SHajimu UMEMOTO	fi
41*587392a5SHajimu UMEMOTOfi
42*587392a5SHajimu UMEMOTOIFACEDIR="$VARDIR/interfaces"
43*587392a5SHajimu UMEMOTOMETRICDIR="$VARDIR/metrics"
44*587392a5SHajimu UMEMOTOPRIVATEDIR="$VARDIR/private"
45*587392a5SHajimu UMEMOTO
46*587392a5SHajimu UMEMOTO: ${dynamic_order:=tap[0-9]* tun[0-9]* vpn vpn[0-9]* ppp[0-9]* ippp[0-9]*}
47*587392a5SHajimu UMEMOTO: ${interface_order:=lo lo[0-9]*}
48*587392a5SHajimu UMEMOTO
49*587392a5SHajimu UMEMOTOerror_exit()
50*587392a5SHajimu UMEMOTO{
51*587392a5SHajimu UMEMOTO	echo "$*" >&2
52*587392a5SHajimu UMEMOTO	exit 1
53*587392a5SHajimu UMEMOTO}
54*587392a5SHajimu UMEMOTO
55*587392a5SHajimu UMEMOTOusage()
56*587392a5SHajimu UMEMOTO{
57*587392a5SHajimu UMEMOTO	cat <<-EOF
58*587392a5SHajimu UMEMOTO	Usage: ${RESOLVCONF##*/} [options]
59*587392a5SHajimu UMEMOTO
60*587392a5SHajimu UMEMOTO	Inform the system about any DNS updates.
61*587392a5SHajimu UMEMOTO
62*587392a5SHajimu UMEMOTO	Options:
63*587392a5SHajimu UMEMOTO	  -a \$INTERFACE    Add DNS information to the specified interface
64*587392a5SHajimu UMEMOTO	                   (DNS supplied via stdin in resolv.conf format)
65*587392a5SHajimu UMEMOTO	  -m metric        Give the added DNS information a metric
66*587392a5SHajimu UMEMOTO	  -p               Mark the interface as private
67*587392a5SHajimu UMEMOTO	  -d \$INTERFACE    Delete DNS information from the specified interface
68*587392a5SHajimu UMEMOTO	  -f               Ignore non existant interfaces
69*587392a5SHajimu UMEMOTO	  -I               Init the state dir
70*587392a5SHajimu UMEMOTO	  -u               Run updates from our current DNS information
71*587392a5SHajimu UMEMOTO	  -l [\$PATTERN]    Show DNS information, optionally from interfaces
72*587392a5SHajimu UMEMOTO	                   that match the specified pattern
73*587392a5SHajimu UMEMOTO	  -i [\$PATTERN]    Show interfaces that have supplied DNS information
74*587392a5SHajimu UMEMOTO                   optionally from interfaces that match the specified
75*587392a5SHajimu UMEMOTO                   pattern
76*587392a5SHajimu UMEMOTO	  -v [\$PATTERN]    echo NEWDOMAIN, NEWSEARCH and NEWNS variables to
77*587392a5SHajimu UMEMOTO	  		   the console
78*587392a5SHajimu UMEMOTO	  -h               Show this help cruft
79*587392a5SHajimu UMEMOTO	EOF
80*587392a5SHajimu UMEMOTO	[ -z "$1" ] && exit 0
81*587392a5SHajimu UMEMOTO	echo
82*587392a5SHajimu UMEMOTO	error_exit "$*"
83*587392a5SHajimu UMEMOTO}
84*587392a5SHajimu UMEMOTO
85*587392a5SHajimu UMEMOTOecho_resolv()
86*587392a5SHajimu UMEMOTO{
87*587392a5SHajimu UMEMOTO	local line=
88*587392a5SHajimu UMEMOTO	[ -n "$1" -a -e "$IFACEDIR/$1" ] || return 1
89*587392a5SHajimu UMEMOTO	echo "# resolv.conf from $1"
90*587392a5SHajimu UMEMOTO	# Our variable maker works of the fact each resolv.conf per interface
91*587392a5SHajimu UMEMOTO	# is separated by blank lines.
92*587392a5SHajimu UMEMOTO	# So we remove them when echoing them.
93*587392a5SHajimu UMEMOTO	while read line; do
94*587392a5SHajimu UMEMOTO		[ -n "$line" ] && echo "$line"
95*587392a5SHajimu UMEMOTO	done < "$IFACEDIR/$1"
96*587392a5SHajimu UMEMOTO	echo
97*587392a5SHajimu UMEMOTO}
98*587392a5SHajimu UMEMOTO
99*587392a5SHajimu UMEMOTO# Parse resolv.conf's and make variables
100*587392a5SHajimu UMEMOTO# for domain name servers, search name servers and global nameservers
101*587392a5SHajimu UMEMOTOparse_resolv()
102*587392a5SHajimu UMEMOTO{
103*587392a5SHajimu UMEMOTO	local line= ns= ds= search= d= n= newns=
104*587392a5SHajimu UMEMOTO	local new=true iface= private=false p=
105*587392a5SHajimu UMEMOTO
106*587392a5SHajimu UMEMOTO	echo "DOMAINS="
107*587392a5SHajimu UMEMOTO	echo "SEARCH=\"$search_domains\""
108*587392a5SHajimu UMEMOTO	# let our subscribers know about global nameservers
109*587392a5SHajimu UMEMOTO	for n in $name_servers; do
110*587392a5SHajimu UMEMOTO		case "$n" in
111*587392a5SHajimu UMEMOTO		127.*|0.0.0.0|255.255.255.255|::1) :;;
112*587392a5SHajimu UMEMOTO		*) newns="$newns${newns:+ }$n";;
113*587392a5SHajimu UMEMOTO		esac
114*587392a5SHajimu UMEMOTO	done
115*587392a5SHajimu UMEMOTO	echo "NAMESERVERS=\"$newns\""
116*587392a5SHajimu UMEMOTO	echo "LOCALNAMESERVERS="
117*587392a5SHajimu UMEMOTO	newns=
118*587392a5SHajimu UMEMOTO
119*587392a5SHajimu UMEMOTO	while read line; do
120*587392a5SHajimu UMEMOTO		case "$line" in
121*587392a5SHajimu UMEMOTO		"# resolv.conf from "*)
122*587392a5SHajimu UMEMOTO			if ${new}; then
123*587392a5SHajimu UMEMOTO				iface="${line#\# resolv.conf from *}"
124*587392a5SHajimu UMEMOTO				new=false
125*587392a5SHajimu UMEMOTO				if [ -e "$PRIVATEDIR/$iface" ]; then
126*587392a5SHajimu UMEMOTO					private=true
127*587392a5SHajimu UMEMOTO				else
128*587392a5SHajimu UMEMOTO					# Allow expansion
129*587392a5SHajimu UMEMOTO					cd "$IFACEDIR"
130*587392a5SHajimu UMEMOTO					private=false
131*587392a5SHajimu UMEMOTO					for p in $private_interfaces; do
132*587392a5SHajimu UMEMOTO						if [ "$p" = "$iface" ]; then
133*587392a5SHajimu UMEMOTO							private=true
134*587392a5SHajimu UMEMOTO							break
135*587392a5SHajimu UMEMOTO						fi
136*587392a5SHajimu UMEMOTO					done
137*587392a5SHajimu UMEMOTO				fi
138*587392a5SHajimu UMEMOTO			fi
139*587392a5SHajimu UMEMOTO			;;
140*587392a5SHajimu UMEMOTO		"nameserver "*)
141*587392a5SHajimu UMEMOTO			case "${line#* }" in
142*587392a5SHajimu UMEMOTO			127.*|0.0.0.0|255.255.255.255|::1)
143*587392a5SHajimu UMEMOTO				echo "LOCALNAMESERVERS=\"\$LOCALNAMESERVERS ${line#* }\""
144*587392a5SHajimu UMEMOTO				continue
145*587392a5SHajimu UMEMOTO				;;
146*587392a5SHajimu UMEMOTO			esac
147*587392a5SHajimu UMEMOTO			ns="$ns${line#* } "
148*587392a5SHajimu UMEMOTO			;;
149*587392a5SHajimu UMEMOTO		"domain "*|"search "*)
150*587392a5SHajimu UMEMOTO			search="${line#* }"
151*587392a5SHajimu UMEMOTO			;;
152*587392a5SHajimu UMEMOTO		*)
153*587392a5SHajimu UMEMOTO			[ -n "$line" ] && continue
154*587392a5SHajimu UMEMOTO			if [ -n "$ns" -a -n "$search" ]; then
155*587392a5SHajimu UMEMOTO				newns=
156*587392a5SHajimu UMEMOTO				for n in $ns; do
157*587392a5SHajimu UMEMOTO					newns="$newns${newns:+,}$n"
158*587392a5SHajimu UMEMOTO				done
159*587392a5SHajimu UMEMOTO				ds=
160*587392a5SHajimu UMEMOTO				for d in $search; do
161*587392a5SHajimu UMEMOTO					ds="$ds${ds:+ }$d:$newns"
162*587392a5SHajimu UMEMOTO				done
163*587392a5SHajimu UMEMOTO				echo "DOMAINS=\"\$DOMAINS $ds\""
164*587392a5SHajimu UMEMOTO			fi
165*587392a5SHajimu UMEMOTO			echo "SEARCH=\"\$SEARCH $search\""
166*587392a5SHajimu UMEMOTO			if ! $private; then
167*587392a5SHajimu UMEMOTO				echo "NAMESERVERS=\"\$NAMESERVERS $ns\""
168*587392a5SHajimu UMEMOTO			fi
169*587392a5SHajimu UMEMOTO			ns=
170*587392a5SHajimu UMEMOTO			search=
171*587392a5SHajimu UMEMOTO			new=true
172*587392a5SHajimu UMEMOTO			;;
173*587392a5SHajimu UMEMOTO		esac
174*587392a5SHajimu UMEMOTO	done
175*587392a5SHajimu UMEMOTO}
176*587392a5SHajimu UMEMOTO
177*587392a5SHajimu UMEMOTOuniqify()
178*587392a5SHajimu UMEMOTO{
179*587392a5SHajimu UMEMOTO	local result=
180*587392a5SHajimu UMEMOTO	while [ -n "$1" ]; do
181*587392a5SHajimu UMEMOTO		case " $result " in
182*587392a5SHajimu UMEMOTO		*" $1 "*);;
183*587392a5SHajimu UMEMOTO		*) result="$result $1";;
184*587392a5SHajimu UMEMOTO		esac
185*587392a5SHajimu UMEMOTO		shift
186*587392a5SHajimu UMEMOTO	done
187*587392a5SHajimu UMEMOTO	echo "${result# *}"
188*587392a5SHajimu UMEMOTO}
189*587392a5SHajimu UMEMOTO
190*587392a5SHajimu UMEMOTOlist_resolv()
191*587392a5SHajimu UMEMOTO{
192*587392a5SHajimu UMEMOTO	[ -d "$IFACEDIR" ] || return 0
193*587392a5SHajimu UMEMOTO
194*587392a5SHajimu UMEMOTO	local report=false list= retval=0 cmd="$1"
195*587392a5SHajimu UMEMOTO	shift
196*587392a5SHajimu UMEMOTO
197*587392a5SHajimu UMEMOTO	# If we have an interface ordering list, then use that.
198*587392a5SHajimu UMEMOTO	# It works by just using pathname expansion in the interface directory.
199*587392a5SHajimu UMEMOTO	if [ -n "$1" ]; then
200*587392a5SHajimu UMEMOTO		list="$@"
201*587392a5SHajimu UMEMOTO		$force || report=true
202*587392a5SHajimu UMEMOTO	else
203*587392a5SHajimu UMEMOTO		cd "$IFACEDIR"
204*587392a5SHajimu UMEMOTO		for i in $interface_order; do
205*587392a5SHajimu UMEMOTO			[ -e "$i" ] && list="$list $i"
206*587392a5SHajimu UMEMOTO		done
207*587392a5SHajimu UMEMOTO		for i in $dynamic_order; do
208*587392a5SHajimu UMEMOTO			if [ -e "$i" -a ! -e "$METRICDIR/"*" $i" ]; then
209*587392a5SHajimu UMEMOTO				list="$list $i"
210*587392a5SHajimu UMEMOTO			fi
211*587392a5SHajimu UMEMOTO		done
212*587392a5SHajimu UMEMOTO		if [ -d "$METRICDIR" ]; then
213*587392a5SHajimu UMEMOTO			cd "$METRICDIR"
214*587392a5SHajimu UMEMOTO			for i in *; do
215*587392a5SHajimu UMEMOTO				list="$list ${i#* }"
216*587392a5SHajimu UMEMOTO			done
217*587392a5SHajimu UMEMOTO		fi
218*587392a5SHajimu UMEMOTO		list="$list *"
219*587392a5SHajimu UMEMOTO	fi
220*587392a5SHajimu UMEMOTO
221*587392a5SHajimu UMEMOTO	cd "$IFACEDIR"
222*587392a5SHajimu UMEMOTO	for i in $(uniqify $list); do
223*587392a5SHajimu UMEMOTO		# Only list interfaces which we really have
224*587392a5SHajimu UMEMOTO		if ! [ -e "$i" ]; then
225*587392a5SHajimu UMEMOTO			if $report; then
226*587392a5SHajimu UMEMOTO				echo "No resolv.conf for interface $i" >&2
227*587392a5SHajimu UMEMOTO				retval=$(($retval + 1))
228*587392a5SHajimu UMEMOTO			fi
229*587392a5SHajimu UMEMOTO			continue
230*587392a5SHajimu UMEMOTO		fi
231*587392a5SHajimu UMEMOTO
232*587392a5SHajimu UMEMOTO		if [ "$cmd" = i -o "$cmd" = "-i" ]; then
233*587392a5SHajimu UMEMOTO			printf "$i "
234*587392a5SHajimu UMEMOTO		else
235*587392a5SHajimu UMEMOTO			echo_resolv "$i"
236*587392a5SHajimu UMEMOTO		fi
237*587392a5SHajimu UMEMOTO	done
238*587392a5SHajimu UMEMOTO	[ "$cmd" = i -o "$cmd" = "-i" ] && echo
239*587392a5SHajimu UMEMOTO	return $retval
240*587392a5SHajimu UMEMOTO}
241*587392a5SHajimu UMEMOTO
242*587392a5SHajimu UMEMOTOmake_vars()
243*587392a5SHajimu UMEMOTO{
244*587392a5SHajimu UMEMOTO	eval "$(list_resolv -l "$@" | parse_resolv)"
245*587392a5SHajimu UMEMOTO
246*587392a5SHajimu UMEMOTO	# Ensure that we only list each domain once
247*587392a5SHajimu UMEMOTO	newdomains=
248*587392a5SHajimu UMEMOTO	for d in $DOMAINS; do
249*587392a5SHajimu UMEMOTO		dn="${d%%:*}"
250*587392a5SHajimu UMEMOTO		case " $newdomains" in
251*587392a5SHajimu UMEMOTO		*" ${dn}:"*) continue;;
252*587392a5SHajimu UMEMOTO		esac
253*587392a5SHajimu UMEMOTO		newdomains="$newdomains${newdomains:+ }$dn:"
254*587392a5SHajimu UMEMOTO		newns=
255*587392a5SHajimu UMEMOTO		for nd in $DOMAINS; do
256*587392a5SHajimu UMEMOTO			if [ "$dn" = "${nd%%:*}" ]; then
257*587392a5SHajimu UMEMOTO				ns="${nd#*:}"
258*587392a5SHajimu UMEMOTO				while [ -n "$ns" ]; do
259*587392a5SHajimu UMEMOTO					case ",$newns," in
260*587392a5SHajimu UMEMOTO					*,${ns%%,*},*) ;;
261*587392a5SHajimu UMEMOTO					*) newns="$newns${newns:+,}${ns%%,*}";;
262*587392a5SHajimu UMEMOTO					esac
263*587392a5SHajimu UMEMOTO					[ "$ns" = "${ns#*,}" ] && break
264*587392a5SHajimu UMEMOTO					ns="${ns#*,}"
265*587392a5SHajimu UMEMOTO				done
266*587392a5SHajimu UMEMOTO			fi
267*587392a5SHajimu UMEMOTO		done
268*587392a5SHajimu UMEMOTO		newdomains="$newdomains$newns"
269*587392a5SHajimu UMEMOTO	done
270*587392a5SHajimu UMEMOTO	echo "DOMAINS='$newdomains'"
271*587392a5SHajimu UMEMOTO	echo "SEARCH='$(uniqify $SEARCH)'"
272*587392a5SHajimu UMEMOTO	echo "NAMESERVERS='$(uniqify $NAMESERVERS)'"
273*587392a5SHajimu UMEMOTO	echo "LOCALNAMESERVERS='$(uniqify $LOCALNAMESERVERS)'"
274*587392a5SHajimu UMEMOTO}
275*587392a5SHajimu UMEMOTO
276*587392a5SHajimu UMEMOTOforce=false
277*587392a5SHajimu UMEMOTOwhile getopts a:d:fhIilm:puv OPT; do
278*587392a5SHajimu UMEMOTO	case "$OPT" in
279*587392a5SHajimu UMEMOTO	f) force=true;;
280*587392a5SHajimu UMEMOTO	h) usage;;
281*587392a5SHajimu UMEMOTO	m) IF_METRIC="$OPTARG";;
282*587392a5SHajimu UMEMOTO	p) IF_PRIVATE=1;;
283*587392a5SHajimu UMEMOTO	'?') ;;
284*587392a5SHajimu UMEMOTO	*) cmd="$OPT"; iface="$OPTARG";;
285*587392a5SHajimu UMEMOTO	esac
286*587392a5SHajimu UMEMOTOdone
287*587392a5SHajimu UMEMOTOshift $(($OPTIND - 1))
288*587392a5SHajimu UMEMOTOargs="$iface${iface:+ }$@"
289*587392a5SHajimu UMEMOTO
290*587392a5SHajimu UMEMOTO# -I inits the state dir
291*587392a5SHajimu UMEMOTOif [ "$cmd" = I ]; then
292*587392a5SHajimu UMEMOTO	if [ -d "$VARDIR" ]; then
293*587392a5SHajimu UMEMOTO		rm -rf "$VARDIR"/*
294*587392a5SHajimu UMEMOTO	fi
295*587392a5SHajimu UMEMOTO	exit $?
296*587392a5SHajimu UMEMOTOfi
297*587392a5SHajimu UMEMOTO
298*587392a5SHajimu UMEMOTO# -l lists our resolv files, optionally for a specific interface
299*587392a5SHajimu UMEMOTOif [ "$cmd" = l -o "$cmd" = i ]; then
300*587392a5SHajimu UMEMOTO	list_resolv "$cmd" "$args"
301*587392a5SHajimu UMEMOTO	exit $?
302*587392a5SHajimu UMEMOTOfi
303*587392a5SHajimu UMEMOTO
304*587392a5SHajimu UMEMOTO# Not normally needed, but subscribers should be able to run independently
305*587392a5SHajimu UMEMOTOif [ "$cmd" = v ]; then
306*587392a5SHajimu UMEMOTO	make_vars "$iface"
307*587392a5SHajimu UMEMOTO	exit $?
308*587392a5SHajimu UMEMOTOfi
309*587392a5SHajimu UMEMOTO
310*587392a5SHajimu UMEMOTO# Test that we have valid options
311*587392a5SHajimu UMEMOTOif [ "$cmd" = a -o "$cmd" = d ]; then
312*587392a5SHajimu UMEMOTO	if [ -z "$iface" ]; then
313*587392a5SHajimu UMEMOTO		usage "Interface not specified"
314*587392a5SHajimu UMEMOTO	fi
315*587392a5SHajimu UMEMOTOelif [ "$cmd" != u ]; then
316*587392a5SHajimu UMEMOTO	[ -n "$cmd" -a "$cmd" != h ] && usage "Unknown option $cmd"
317*587392a5SHajimu UMEMOTO	usage
318*587392a5SHajimu UMEMOTOfi
319*587392a5SHajimu UMEMOTOif [ "$cmd" = a ]; then
320*587392a5SHajimu UMEMOTO	for x in '/' \\ ' ' '*'; do
321*587392a5SHajimu UMEMOTO		case "$iface" in
322*587392a5SHajimu UMEMOTO		*[$x]*) error_exit "$x not allowed in interface name";;
323*587392a5SHajimu UMEMOTO		esac
324*587392a5SHajimu UMEMOTO	done
325*587392a5SHajimu UMEMOTO	for x in '.' '-' '~'; do
326*587392a5SHajimu UMEMOTO		case "$iface" in
327*587392a5SHajimu UMEMOTO		[$x]*) error_exit \
328*587392a5SHajimu UMEMOTO			"$x not allowed at start of interface name";;
329*587392a5SHajimu UMEMOTO		esac
330*587392a5SHajimu UMEMOTO	done
331*587392a5SHajimu UMEMOTO	[ "$cmd" = a -a -t 0 ] && error_exit "No file given via stdin"
332*587392a5SHajimu UMEMOTOfi
333*587392a5SHajimu UMEMOTO
334*587392a5SHajimu UMEMOTOif [ ! -d "$IFACEDIR" ]; then
335*587392a5SHajimu UMEMOTO	if [ ! -d "$VARDIR" ]; then
336*587392a5SHajimu UMEMOTO		if [ -L "$VARDIR" ]; then
337*587392a5SHajimu UMEMOTO			dir="$(readlink "$VARDIR")"
338*587392a5SHajimu UMEMOTO			# link maybe relative
339*587392a5SHajimu UMEMOTO			cd "${VARDIR%/*}"
340*587392a5SHajimu UMEMOTO			if ! mkdir -m 0755 -p "$dir"; then
341*587392a5SHajimu UMEMOTO				error_exit "Failed to create needed" \
342*587392a5SHajimu UMEMOTO					"directory $dir"
343*587392a5SHajimu UMEMOTO			fi
344*587392a5SHajimu UMEMOTO		else
345*587392a5SHajimu UMEMOTO			if ! mkdir -m 0755 -p "$VARDIR"; then
346*587392a5SHajimu UMEMOTO				error_exit "Failed to create needed" \
347*587392a5SHajimu UMEMOTO					"directory $VARDIR"
348*587392a5SHajimu UMEMOTO			fi
349*587392a5SHajimu UMEMOTO		fi
350*587392a5SHajimu UMEMOTO	fi
351*587392a5SHajimu UMEMOTO	mkdir -m 0755 -p "$IFACEDIR" || \
352*587392a5SHajimu UMEMOTO		error_exit "Failed to create needed directory $IFACEDIR"
353*587392a5SHajimu UMEMOTOelse
354*587392a5SHajimu UMEMOTO	# Delete any existing information about the interface
355*587392a5SHajimu UMEMOTO	if [ "$cmd" = d ]; then
356*587392a5SHajimu UMEMOTO		cd "$IFACEDIR"
357*587392a5SHajimu UMEMOTO		for i in $args; do
358*587392a5SHajimu UMEMOTO			if [ "$cmd" = d -a ! -e "$i" ]; then
359*587392a5SHajimu UMEMOTO				$force && continue
360*587392a5SHajimu UMEMOTO				error_exit "No resolv.conf for" \
361*587392a5SHajimu UMEMOTO					"interface $i"
362*587392a5SHajimu UMEMOTO			fi
363*587392a5SHajimu UMEMOTO			rm -f "$i" "$METRICDIR/"*" $i" \
364*587392a5SHajimu UMEMOTO				"$PRIVATEDIR/$i" || exit $?
365*587392a5SHajimu UMEMOTO		done
366*587392a5SHajimu UMEMOTO	fi
367*587392a5SHajimu UMEMOTOfi
368*587392a5SHajimu UMEMOTO
369*587392a5SHajimu UMEMOTOif [ "$cmd" = a ]; then
370*587392a5SHajimu UMEMOTO	# Read resolv.conf from stdin
371*587392a5SHajimu UMEMOTO	resolv="$(cat)\n"
372*587392a5SHajimu UMEMOTO	# If what we are given matches what we have, then do nothing
373*587392a5SHajimu UMEMOTO	if [ -e "$IFACEDIR/$iface" ]; then
374*587392a5SHajimu UMEMOTO		if [ "$(printf "$resolv")" = \
375*587392a5SHajimu UMEMOTO			"$(cat "$IFACEDIR/$iface")" ]
376*587392a5SHajimu UMEMOTO		then
377*587392a5SHajimu UMEMOTO			exit 0
378*587392a5SHajimu UMEMOTO		fi
379*587392a5SHajimu UMEMOTO		rm "$IFACEDIR/$iface"
380*587392a5SHajimu UMEMOTO	fi
381*587392a5SHajimu UMEMOTO	printf "$resolv" >"$IFACEDIR/$iface" || exit $?
382*587392a5SHajimu UMEMOTO	[ ! -d "$METRICDIR" ] && mkdir "$METRICDIR"
383*587392a5SHajimu UMEMOTO	rm -f "$METRICDIR/"*" $iface"
384*587392a5SHajimu UMEMOTO	if [ -n "$IF_METRIC" ]; then
385*587392a5SHajimu UMEMOTO		# Pad metric to 6 characters, so 5 is less than 10
386*587392a5SHajimu UMEMOTO		while [ ${#IF_METRIC} -le 6 ]; do
387*587392a5SHajimu UMEMOTO			IF_METRIC="0$IF_METRIC"
388*587392a5SHajimu UMEMOTO		done
389*587392a5SHajimu UMEMOTO		echo " " >"$METRICDIR/$IF_METRIC $iface"
390*587392a5SHajimu UMEMOTO	fi
391*587392a5SHajimu UMEMOTO	case "$IF_PRIVATE" in
392*587392a5SHajimu UMEMOTO	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
393*587392a5SHajimu UMEMOTO		if [ ! -d "$PRIVATEDIR" ]; then
394*587392a5SHajimu UMEMOTO			[ -e "$PRIVATEDIR" ] && rm "$PRIVATEDIR"
395*587392a5SHajimu UMEMOTO			mkdir "$PRIVATEDIR"
396*587392a5SHajimu UMEMOTO		fi
397*587392a5SHajimu UMEMOTO		[ -d "$PRIVATEDIR" ] && echo " " >"$PRIVATEDIR/$iface"
398*587392a5SHajimu UMEMOTO		;;
399*587392a5SHajimu UMEMOTO	*)
400*587392a5SHajimu UMEMOTO		if [ -e "$PRIVATEDIR/$iface" ]; then
401*587392a5SHajimu UMEMOTO			rm -f "$PRIVATEDIR/$iface"
402*587392a5SHajimu UMEMOTO		fi
403*587392a5SHajimu UMEMOTO		;;
404*587392a5SHajimu UMEMOTO	esac
405*587392a5SHajimu UMEMOTOfi
406*587392a5SHajimu UMEMOTO
407*587392a5SHajimu UMEMOTOeval "$(make_vars)"
408*587392a5SHajimu UMEMOTOexport RESOLVCONF DOMAINS SEARCH NAMESERVERS LOCALNAMESERVERS
409*587392a5SHajimu UMEMOTO: ${list_resolv:=list_resolv -l}
410*587392a5SHajimu UMEMOTOretval=0
411*587392a5SHajimu UMEMOTOfor script in "$LIBEXECDIR"/*; do
412*587392a5SHajimu UMEMOTO	if [ -f "$script" ]; then
413*587392a5SHajimu UMEMOTO		if [ -x "$script" ]; then
414*587392a5SHajimu UMEMOTO			"$script" "$cmd" "$iface"
415*587392a5SHajimu UMEMOTO		else
416*587392a5SHajimu UMEMOTO			(. "$script" "$cmd" "$iface")
417*587392a5SHajimu UMEMOTO		fi
418*587392a5SHajimu UMEMOTO		retval=$(($retval + $?))
419*587392a5SHajimu UMEMOTO	fi
420*587392a5SHajimu UMEMOTOdone
421*587392a5SHajimu UMEMOTOexit $retval
422