svn commit: r339413 - in head: libexec libexec/rc libexec/rc/rc.d sbin/init sbin/init/rc.d

Bjoern A. Zeeb bz at FreeBSD.org
Wed Oct 17 16:49:13 UTC 2018


Author: bz
Date: Wed Oct 17 16:49:11 2018
New Revision: 339413
URL: https://svnweb.freebsd.org/changeset/base/339413

Log:
  Move the rc framework out of sbin/init into libexec/rc.
  
  The reasons for this are forward looking to pkgbase:
   * /sbin/init is a special binary; try not to replace it with
     every package update because an rc script was touched.
     (a follow-up commit will make init its own package)
   * having rc in its own place will allow more easy replacement
     of the rc framework with alternatives, such as openrc.
  
  Discussed with:		brd (during BSDCam), kmoore
  Requested by:		cem, bz
  PR:			231522
  Approved by:		re (gjb)

Added:
  head/libexec/rc/
  head/libexec/rc/Makefile   (contents, props changed)
  head/libexec/rc/netstart
     - copied unchanged from r339412, head/sbin/init/netstart
  head/libexec/rc/network.subr
     - copied unchanged from r339412, head/sbin/init/network.subr
  head/libexec/rc/pccard_ether
     - copied unchanged from r339412, head/sbin/init/pccard_ether
  head/libexec/rc/rc
     - copied unchanged from r339412, head/sbin/init/rc
  head/libexec/rc/rc.conf
     - copied unchanged from r339412, head/sbin/init/rc.conf
  head/libexec/rc/rc.d/
     - copied from r339412, head/sbin/init/rc.d/
  head/libexec/rc/rc.initdiskless
     - copied unchanged from r339412, head/sbin/init/rc.initdiskless
  head/libexec/rc/rc.resume
     - copied unchanged from r339412, head/sbin/init/rc.resume
  head/libexec/rc/rc.shutdown
     - copied unchanged from r339412, head/sbin/init/rc.shutdown
  head/libexec/rc/rc.subr
     - copied unchanged from r339412, head/sbin/init/rc.subr
  head/libexec/rc/rc.suspend
     - copied unchanged from r339412, head/sbin/init/rc.suspend
Deleted:
  head/sbin/init/netstart
  head/sbin/init/network.subr
  head/sbin/init/pccard_ether
  head/sbin/init/rc
  head/sbin/init/rc.conf
  head/sbin/init/rc.d/
  head/sbin/init/rc.initdiskless
  head/sbin/init/rc.resume
  head/sbin/init/rc.shutdown
  head/sbin/init/rc.subr
  head/sbin/init/rc.suspend
Modified:
  head/libexec/Makefile
  head/libexec/rc/rc.d/Makefile
  head/sbin/init/Makefile

Modified: head/libexec/Makefile
==============================================================================
--- head/libexec/Makefile	Wed Oct 17 16:38:44 2018	(r339412)
+++ head/libexec/Makefile	Wed Oct 17 16:49:11 2018	(r339413)
@@ -13,6 +13,7 @@ SUBDIR=	${_atf} \
 	${_makewhatis.local} \
 	${_mknetid} \
 	${_pppoed} \
+	rc \
 	revnetgroup \
 	${_rlogind} \
 	rpc.rquotad \

Added: head/libexec/rc/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rc/Makefile	Wed Oct 17 16:49:11 2018	(r339413)
@@ -0,0 +1,16 @@
+# $FreeBSD$
+
+CONFGROUPS=	CONFETC CONFETCEXEC CONFETCDEFAULTS
+CONFETCDIR=	/etc
+CONFETC=	network.subr rc rc.initdiskless rc.subr rc.shutdown
+CONFETCMODE=	644
+CONFETCEXEC=	netstart pccard_ether rc.resume rc.suspend
+CONFETCEXECDIR=	/etc
+CONFETCEXECMODE=	755
+CONFETCDEFAULTSDIR=	/etc/defaults
+CONFETCDEFAULTS=	rc.conf
+PACKAGE=rc
+
+SUBDIR+=	rc.d
+
+.include <bsd.prog.mk>

Copied: head/libexec/rc/netstart (from r339412, head/sbin/init/netstart)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rc/netstart	Wed Oct 17 16:49:11 2018	(r339413, copy of r339412, head/sbin/init/netstart)
@@ -0,0 +1,57 @@
+#!/bin/sh -
+#
+# Copyright (c) 1993  The FreeBSD Project
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. 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 AUTHOR 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 AUTHOR 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.
+#
+# $FreeBSD$
+#	From: @(#)netstart	5.9 (Berkeley) 3/30/91
+#
+
+# This file is NOT called by any of the other scripts - it has been
+# obsoleted by /etc/rc.d/* and is provided here only for user
+# convenience (if you're sitting in single user mode and wish to start
+# the network by hand, this script will do it for you).
+#
+
+_start=quietstart
+
+/etc/rc.d/devd ${_start}
+/etc/rc.d/hostid ${_start}
+/etc/rc.d/hostname ${_start}
+/etc/rc.d/ipmon ${_start}
+/etc/rc.d/ipfilter ${_start}
+/etc/rc.d/ipnat ${_start}
+/etc/rc.d/ipfs ${_start}
+/etc/rc.d/sppp ${_start}
+/etc/rc.d/netif ${_start}
+/etc/rc.d/ipsec ${_start}
+/etc/rc.d/ppp ${_start}
+/etc/rc.d/ipfw ${_start}
+/etc/rc.d/routing ${_start}
+/etc/rc.d/route6d ${_start}
+/etc/rc.d/routed ${_start}
+/etc/rc.d/rtsold ${_start}
+/etc/rc.d/nisdomain ${_start}
+
+exit 0

Copied: head/libexec/rc/network.subr (from r339412, head/sbin/init/network.subr)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/libexec/rc/network.subr	Wed Oct 17 16:49:11 2018	(r339413, copy of r339412, head/sbin/init/network.subr)
@@ -0,0 +1,1793 @@
+#
+# Copyright (c) 2003 The FreeBSD Project. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. 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 PROJECT 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 PROJECT 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.
+#
+# $FreeBSD$
+#
+IFCONFIG_CMD="/sbin/ifconfig"
+: ${netif_ipexpand_max:=2048}
+
+#
+# Subroutines commonly used from network startup scripts.
+# Requires that rc.conf be loaded first.
+#
+
+# ifn_start ifn
+#	Bring up and configure an interface.  If some configuration is
+#	applied, print the interface configuration.
+#
+ifn_start()
+{
+	local ifn cfg
+	ifn="$1"
+	cfg=1
+
+	[ -z "$ifn" ] && err 1 "ifn_start called without an interface"
+
+	ifscript_up ${ifn} && cfg=0
+	ifconfig_up ${ifn} && cfg=0
+	if ! noafif $ifn; then
+		afexists inet && ipv4_up ${ifn} && cfg=0
+		afexists inet6 && ipv6_up ${ifn} && cfg=0
+	fi
+	childif_create ${ifn} && cfg=0
+
+	return $cfg
+}
+
+# ifn_stop ifn
+#	Shutdown and de-configure an interface.  If action is taken,
+#	print the interface name.
+#
+ifn_stop()
+{
+	local ifn cfg
+	ifn="$1"
+	cfg=1
+
+	[ -z "$ifn" ] && err 1 "ifn_stop called without an interface"
+
+	if ! noafif $ifn; then
+		afexists inet6 && ipv6_down ${ifn} && cfg=0
+		afexists inet && ipv4_down ${ifn} && cfg=0
+	fi
+	ifconfig_down ${ifn} && cfg=0
+	ifscript_down ${ifn} && cfg=0
+	childif_destroy ${ifn} && cfg=0
+
+	return $cfg
+}
+
+# ifn_vnetup ifn
+#	Move ifn to the specified vnet jail.
+#
+ifn_vnetup()
+{
+
+	ifn_vnet0 $1 vnet
+}
+
+# ifn_vnetdown ifn
+#	Reclaim ifn from the specified vnet jail.
+#
+ifn_vnetdown()
+{
+
+	ifn_vnet0 $1 -vnet
+}
+
+# ifn_vnet0 ifn action
+#	Helper function for ifn_vnetup and ifn_vnetdown.
+#
+ifn_vnet0()
+{
+	local _ifn _cfg _action _vnet
+	_ifn="$1"
+	_action="$2"
+	_cfg=1
+
+	if _vnet=$(vnetif $_ifn); then
+		${IFCONFIG_CMD} $_ifn $_action $_vnet && _cfg=0
+	fi
+
+	return $_cfg
+}
+
+# ifconfig_up if
+#	Evaluate ifconfig(8) arguments for interface $if and
+#	run ifconfig(8) with those arguments. It returns 0 if
+#	arguments were found and executed or 1 if the interface
+#	had no arguments.  Pseudo arguments DHCP and WPA are handled
+#	here.
+#
+ifconfig_up()
+{
+	local _cfg _ifconfig_descr _ipv6_opts ifconfig_args 
+	_cfg=1
+
+	# Make sure lo0 always comes up.
+	if [ "$1" = "lo0" ]; then
+		_cfg=0
+	fi
+
+	# inet6 specific
+	if ! noafif $1 && afexists inet6; then
+		if checkyesno ipv6_activate_all_interfaces; then
+			_ipv6_opts="-ifdisabled"
+		elif [ "$1" != "lo0" ]; then
+			_ipv6_opts="ifdisabled"
+		fi
+
+		# backward compatibility: $ipv6_enable
+		case $ipv6_enable in
+		[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
+			case $1 in
+			bridge[0-9]*)
+				# No accept_rtadv by default on if_bridge(4)
+				# to avoid a conflict with the member
+				# interfaces.
+			;;
+			*)
+				if ! checkyesno ipv6_gateway_enable; then
+					_ipv6_opts="${_ipv6_opts} accept_rtadv"
+				fi
+			;;
+			esac
+		;;
+		esac
+
+		case $ipv6_cpe_wanif in
+		$1)
+			_ipv6_opts="${_ipv6_opts} -no_radr accept_rtadv"
+		;;
+		esac
+
+		if [ -n "${_ipv6_opts}" ]; then
+			${IFCONFIG_CMD} $1 inet6 ${_ipv6_opts}
+		fi
+	fi
+
+	# ifconfig_IF
+	ifconfig_args=`ifconfig_getargs $1`
+	if [ -n "${ifconfig_args}" ]; then
+		eval ${IFCONFIG_CMD} $1 ${ifconfig_args}
+		_cfg=0
+	fi
+
+	# inet6 specific
+	if ! noafif $1 && afexists inet6; then
+		# ifconfig_IF_ipv6
+		ifconfig_args=`ifconfig_getargs $1 ipv6`
+		if [ -n "${ifconfig_args}" ]; then
+			# backward compatibility: inet6 keyword
+			case "${ifconfig_args}" in
+			:*|[0-9a-fA-F]*:*)
+				warn "\$ifconfig_$1_ipv6 needs leading" \
+				    "\"inet6\" keyword for an IPv6 address."
+				ifconfig_args="inet6 ${ifconfig_args}"
+			;;
+			esac
+			${IFCONFIG_CMD} $1 inet6 -ifdisabled
+			eval ${IFCONFIG_CMD} $1 ${ifconfig_args}
+			_cfg=0
+		fi
+
+		# $ipv6_prefix_IF will be handled in
+		# ipv6_prefix_hostid_addr_common().
+		ifconfig_args=`get_if_var $1 ipv6_prefix_IF`
+		if [ -n "${ifconfig_args}" ]; then
+			${IFCONFIG_CMD} $1 inet6 -ifdisabled
+			_cfg=0
+		fi
+
+		# backward compatibility: $ipv6_ifconfig_IF
+		ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF`
+		if [ -n "${ifconfig_args}" ]; then
+			warn "\$ipv6_ifconfig_$1 is obsolete." \
+			    "  Use ifconfig_$1_ipv6 instead."
+			${IFCONFIG_CMD} $1 inet6 -ifdisabled
+			eval ${IFCONFIG_CMD} $1 inet6 ${ifconfig_args}
+			_cfg=0
+		fi
+	fi
+
+	ifalias $1 link alias
+	ifalias $1 ether alias
+
+	_ifconfig_descr=`get_if_var $1 ifconfig_IF_descr`
+	if [ -n "${_ifconfig_descr}" ]; then
+		${IFCONFIG_CMD} $1 description "${_ifconfig_descr}"
+	fi
+
+	if wpaif $1; then
+		/etc/rc.d/wpa_supplicant start $1
+		_cfg=0		# XXX: not sure this should count
+	elif hostapif $1; then
+		/etc/rc.d/hostapd start $1
+		_cfg=0
+	elif [ ${_cfg} -eq 0 ]; then
+		${IFCONFIG_CMD} $1 up
+	fi
+
+	if dhcpif $1; then
+		if [ $_cfg -ne 0 ] ; then
+			${IFCONFIG_CMD} $1 up
+		fi
+		if syncdhcpif $1; then
+			/etc/rc.d/dhclient start $1
+		fi
+		_cfg=0
+	fi
+
+	return $_cfg
+}
+
+# ifconfig_down if
+#	returns 1 if wpa_supplicant or dhclient was stopped or
+#	the interface exists.
+#
+ifconfig_down()
+{
+	local _cfg
+	_cfg=1
+
+	if wpaif $1; then
+		/etc/rc.d/wpa_supplicant stop $1
+		_cfg=0
+	elif hostapif $1; then
+		/etc/rc.d/hostapd stop $1
+		_cfg=0
+	fi
+
+	if dhcpif $1; then
+		/etc/rc.d/dhclient stop $1
+		_cfg=0
+	fi
+
+	if ifexists $1; then
+		${IFCONFIG_CMD} $1 down
+		_cfg=0
+	fi
+
+	return $_cfg
+}
+
+# get_if_var if var [default]
+#	Return the value of the pseudo-hash corresponding to $if where
+#	$var is a string containg the sub-string "IF" which will be
+#	replaced with $if after the characters defined in _punct are
+#	replaced with '_'. If the variable is unset, replace it with
+#	$default if given.
+get_if_var()
+{
+	local _if _punct _punct_c _var _default prefix suffix
+
+	if [ $# -ne 2 -a $# -ne 3 ]; then
+		err 3 'USAGE: get_if_var name var [default]'
+	fi
+
+	_if=$1
+	_punct=".-/+"
+	ltr ${_if} "${_punct}" '_' _if
+	_var=$2
+	_default=$3
+
+	prefix=${_var%%IF*}
+	suffix=${_var##*IF}
+	eval echo \${${prefix}${_if}${suffix}-${_default}}
+}
+
+# _ifconfig_getargs if [af]
+#	Prints the arguments for the supplied interface to stdout.
+#	Returns 1 if empty.  In general, ifconfig_getargs should be used
+#	outside this file.
+_ifconfig_getargs()
+{
+	local _ifn _af
+	_ifn=$1
+	_af=${2+_$2}
+
+	if [ -z "$_ifn" ]; then
+		return 1
+	fi
+
+	get_if_var $_ifn ifconfig_IF$_af "$ifconfig_DEFAULT"
+}
+
+# ifconfig_getargs if [af]
+#	Takes the result from _ifconfig_getargs and removes pseudo
+#	args such as DHCP and WPA.
+ifconfig_getargs()
+{
+	local _tmpargs _arg _args _vnet
+	_tmpargs=`_ifconfig_getargs $1 $2`
+	if [ $? -eq 1 ]; then
+		return 1
+	fi
+	_args=
+	_vnet=0
+
+	for _arg in $_tmpargs; do
+		case $_arg:$_vnet in
+		[Dd][Hh][Cc][Pp]:0) ;;
+		[Nn][Oo][Aa][Uu][Tt][Oo]:0) ;;
+		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]:0) ;;
+		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]:0) ;;
+		[Ww][Pp][Aa]:0) ;;
+		[Hh][Oo][Ss][Tt][Aa][Pp]:0) ;;
+		vnet:0)	_vnet=1 ;;
+		*:1)	_vnet=0 ;;
+		*:0)
+			_args="$_args $_arg"
+		;;
+		esac
+	done
+
+	echo $_args
+}
+
+# autoif
+#	Returns 0 if the interface should be automatically configured at
+#	boot time and 1 otherwise.
+autoif()
+{
+	local _tmpargs _arg
+	_tmpargs=`_ifconfig_getargs $1`
+
+	for _arg in $_tmpargs; do
+		case $_arg in
+		[Nn][Oo][Aa][Uu][Tt][Oo])
+			return 1
+			;;
+		esac
+	done
+
+	return 0
+}
+
+# dhcpif if
+#	Returns 0 if the interface is a DHCP interface and 1 otherwise.
+dhcpif()
+{
+	local _tmpargs _arg
+	_tmpargs=`_ifconfig_getargs $1`
+
+	case $1 in
+	lo[0-9]*|\
+	stf[0-9]*|\
+	lp[0-9]*|\
+	sl[0-9]*)
+		return 1
+		;;
+	esac
+	if noafif $1; then
+		return 1
+	fi
+
+	for _arg in $_tmpargs; do
+		case $_arg in
+		[Dd][Hh][Cc][Pp])
+			return 0
+			;;
+		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
+			return 0
+			;;
+		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
+			return 0
+			;;
+		esac
+	done
+
+	return 1
+}
+
+# syncdhcpif
+#	Returns 0 if the interface should be configured synchronously and
+#	1 otherwise.
+syncdhcpif()
+{
+	local _tmpargs _arg
+	_tmpargs=`_ifconfig_getargs $1`
+
+	if noafif $1; then
+		return 1
+	fi
+
+	for _arg in $_tmpargs; do
+		case $_arg in
+		[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
+			return 1
+			;;
+		[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp])
+			return 0
+			;;
+		esac
+	done
+
+	checkyesno synchronous_dhclient
+}
+
+# wpaif if
+#	Returns 0 if the interface is a WPA interface and 1 otherwise.
+wpaif()
+{
+	local _tmpargs _arg
+	_tmpargs=`_ifconfig_getargs $1`
+
+	for _arg in $_tmpargs; do
+		case $_arg in
+		[Ww][Pp][Aa])
+			return 0
+			;;
+		esac
+	done
+
+	return 1
+}
+
+# hostapif if
+#	Returns 0 if the interface is a HOSTAP interface and 1 otherwise.
+hostapif()
+{
+	local _tmpargs _arg
+	_tmpargs=`_ifconfig_getargs $1`
+
+	for _arg in $_tmpargs; do
+		case $_arg in
+		[Hh][Oo][Ss][Tt][Aa][Pp])
+			return 0
+			;;
+		esac
+	done
+
+	return 1
+}
+
+# vnetif if
+#	Returns 0 and echo jail if "vnet" keyword is specified on the
+#	interface, and 1 otherwise.
+vnetif()
+{
+	local _tmpargs _arg _vnet
+	_tmpargs=`_ifconfig_getargs $1`
+
+	_vnet=0
+	for _arg in $_tmpargs; do
+		case $_arg:$_vnet in
+		vnet:0)	_vnet=1 ;;
+		*:1)	echo $_arg; return 0 ;;
+		esac
+	done
+
+	return 1
+}
+
+# afexists af
+#	Returns 0 if the address family is enabled in the kernel
+#	1 otherwise.
+afexists()
+{
+	local _af
+	_af=$1
+
+	case ${_af} in
+	inet|inet6)
+		check_kern_features ${_af}
+		;;
+	link|ether)
+		return 0
+		;;
+	*)
+		err 1 "afexists(): Unsupported address family: $_af"
+		;;
+	esac
+}
+
+# noafif if
+#	Returns 0 if the interface has no af configuration and 1 otherwise.
+noafif()
+{
+	local _if
+	_if=$1
+
+	case $_if in
+	pflog[0-9]*|\
+	pfsync[0-9]*|\
+	usbus[0-9]*|\
+	an[0-9]*|\
+	ath[0-9]*|\
+	ipw[0-9]*|\
+	ipfw[0-9]*|\
+	iwi[0-9]*|\
+	iwn[0-9]*|\
+	ral[0-9]*|\
+	wi[0-9]*|\
+	wl[0-9]*|\
+	wpi[0-9]*)
+		return 0
+		;;
+	esac
+
+	return 1
+}
+
+# ipv6if if
+#	Returns 0 if the interface should be configured for IPv6 and
+#	1 otherwise.
+ipv6if()
+{
+	local _if _tmpargs i
+	_if=$1
+
+	if ! afexists inet6; then
+		return 1
+	fi
+
+	# lo0 is always IPv6-enabled
+	case $_if in
+	lo0)
+		return 0
+		;;
+	esac
+
+	case "${ipv6_network_interfaces}" in
+	$_if|"$_if "*|*" $_if"|*" $_if "*|[Aa][Uu][Tt][Oo])
+		# True if $ifconfig_IF_ipv6 is defined.
+		_tmpargs=`_ifconfig_getargs $_if ipv6`
+		if [ -n "${_tmpargs}" ]; then
+			return 0
+		fi
+
+		# True if $ipv6_prefix_IF is defined.
+		_tmpargs=`get_if_var $_if ipv6_prefix_IF`
+		if [ -n "${_tmpargs}" ]; then
+			return 0
+		fi
+
+		# backward compatibility: True if $ipv6_ifconfig_IF is defined.
+		_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
+		if [ -n "${_tmpargs}" ]; then
+			return 0
+		fi
+		;;
+	esac
+
+	return 1
+}
+
+# ipv6_autoconfif if
+#	Returns 0 if the interface should be configured for IPv6 with
+#	Stateless Address Configuration; 1 otherwise.
+ipv6_autoconfif()
+{
+	local _if _tmpargs _arg
+	_if=$1
+
+	case $_if in
+	lo[0-9]*|\
+	stf[0-9]*|\
+	lp[0-9]*|\
+	sl[0-9]*)
+		return 1
+		;;
+	esac
+	if noafif $_if; then
+		return 1
+	fi
+	if ! ipv6if $_if; then
+		return 1
+	fi
+	if checkyesno ipv6_gateway_enable; then
+		return 1
+	fi
+	_tmpargs=`get_if_var $_if ipv6_prefix_IF`
+	if [ -n "${_tmpargs}" ]; then
+		return 1
+	fi
+	# backward compatibility: $ipv6_enable
+	case $ipv6_enable in
+	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
+		if checkyesno ipv6_gateway_enable; then
+			return 1
+		fi
+		case $1 in
+		bridge[0-9]*)
+			# No accept_rtadv by default on if_bridge(4)
+			# to avoid a conflict with the member
+			# interfaces.
+			return 1
+		;;
+		*)
+			return 0
+		;;
+		esac
+	;;
+	esac
+
+	_tmpargs=`_ifconfig_getargs $_if ipv6`
+	for _arg in $_tmpargs; do
+		case $_arg in
+		accept_rtadv)
+			return 0
+			;;
+		esac
+	done
+
+	# backward compatibility: $ipv6_ifconfig_IF
+	_tmpargs=`get_if_var $_if ipv6_ifconfig_IF`
+	for _arg in $_tmpargs; do
+		case $_arg in
+		accept_rtadv)
+			return 0
+			;;
+		esac
+	done
+
+	return 1
+}
+
+# ifexists if
+#	Returns 0 if the interface exists and 1 otherwise.
+ifexists()
+{
+	[ -z "$1" ] && return 1
+	${IFCONFIG_CMD} -n $1 > /dev/null 2>&1
+}
+
+# ipv4_up if
+#	add IPv4 addresses to the interface $if
+ipv4_up()
+{
+	local _if _ret
+	_if=$1
+	_ret=1
+
+	# Add 127.0.0.1/8 to lo0 unless otherwise specified.
+	if [ "${_if}" = "lo0" ]; then
+		ifconfig_args=`get_if_var ${_if} ifconfig_IF`
+		if [ -z "${ifconfig_args}" ]; then
+			${IFCONFIG_CMD} ${_if} inet 127.0.0.1/8 alias
+		fi
+	fi
+	ifalias ${_if} inet alias && _ret=0
+
+	return $_ret
+}
+
+# ipv6_up if
+#	add IPv6 addresses to the interface $if
+ipv6_up()
+{
+	local _if _ret
+	_if=$1
+	_ret=1
+
+	if ! ipv6if $_if; then
+		return 0
+	fi
+
+	ifalias ${_if} inet6 alias && _ret=0
+	ipv6_prefix_hostid_addr_common ${_if} alias && _ret=0
+	ipv6_accept_rtadv_up ${_if} && _ret=0
+
+	return $_ret
+}
+
+# ipv4_down if
+#	remove IPv4 addresses from the interface $if
+ipv4_down()
+{
+	local _if _ifs _ret inetList oldifs _inet
+	_if=$1
+	_ifs="^"
+	_ret=1
+
+	ifalias ${_if} inet -alias && _ret=0
+
+	inetList="`${IFCONFIG_CMD} ${_if} | grep 'inet ' | tr "\n\t" "$_ifs"`"
+
+	oldifs="$IFS"
+	IFS="$_ifs"
+	for _inet in $inetList ; do
+		# get rid of extraneous line
+		case $_inet in
+		inet\ *)	;;
+		*)		continue ;;
+		esac
+
+		_inet=`expr "$_inet" : '.*\(inet \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*'`
+
+		IFS="$oldifs"
+		${IFCONFIG_CMD} ${_if} ${_inet} delete
+		IFS="$_ifs"
+		_ret=0
+	done
+	IFS="$oldifs"
+
+	return $_ret
+}
+
+# ipv6_down if
+#	remove IPv6 addresses from the interface $if
+ipv6_down()
+{
+	local _if _ifs _ret inetList oldifs _inet6
+	_if=$1
+	_ifs="^"
+	_ret=1
+
+	if ! ipv6if $_if; then
+		return 0
+	fi
+
+	ipv6_accept_rtadv_down ${_if} && _ret=0
+	ipv6_prefix_hostid_addr_common ${_if} -alias && _ret=0
+	ifalias ${_if} inet6 -alias && _ret=0
+
+	inetList="`${IFCONFIG_CMD} ${_if} | grep 'inet6 ' | tr "\n\t" "$_ifs"`"
+
+	oldifs="$IFS"
+	IFS="$_ifs"
+	for _inet6 in $inetList ; do
+		# get rid of extraneous line
+		case $_inet6 in
+		inet6\ *)	;;
+		*)		continue ;;
+		esac
+
+		_inet6=`expr "$_inet6" : '.*\(inet6 \([0-9a-f:]*\)\).*'`
+
+		IFS="$oldifs"
+		${IFCONFIG_CMD} ${_if} ${_inet6} -alias
+		IFS="$_ifs"
+		_ret=0
+	done
+	IFS="$oldifs"
+
+	return $_ret
+}
+
+# ifalias if af action
+#	Configure or remove aliases for network interface $if.
+#	It returns 0 if at least one alias was configured or
+#	removed, or 1 if there were none.
+#
+ifalias()
+{
+	local _ret
+	_ret=1
+
+	afexists $2 || return $_ret
+
+	case "$2" in
+	inet|inet6|link|ether)
+		ifalias_af_common $1 $2 $3 && _ret=0
+		;;
+	esac
+
+	return $_ret
+}
+
+# ifalias_expand_addr af action addr
+#	Expand address range ("N-M") specification in addr.
+#	"addr" must not include an address-family keyword.
+#	The results will include an address-family keyword.
+#
+ifalias_expand_addr()
+{
+	local _af _action
+
+	_af=$1
+	_action=$2
+	shift 2
+
+	afexists $_af || return
+	ifalias_expand_addr_$_af $_action $*
+}
+
+# ifalias_expand_addr_inet action addr
+#	Helper function for ifalias_expand_addr().  Handles IPv4.
+#
+ifalias_expand_addr_inet()
+{
+	local _action _arg _cidr _cidr_addr _exargs
+	local _ipaddr _plen _range _iphead _iptail _iplow _iphigh _ipcount
+	local _retstr _c
+	_action=$1
+	_arg=$2
+	shift 2
+	_exargs=$*
+	_retstr=
+
+	case $_action:$_arg:$_exargs in
+	*:*--*)		return ;;	# invalid
+	tmp:*[0-9]-[0-9]*:*)		# to be expanded
+		_action="alias"
+	;;
+	*:*[0-9]-[0-9]*:*)		# to be expanded
+	;;
+	tmp:*:*netmask*)		# already expanded w/ netmask option
+		echo ${_arg%/[0-9]*} $_exargs && return
+	;;
+	tmp:*:*)			# already expanded w/o netmask option
+		echo $_arg $_exargs && return
+	;;
+	*:*:*netmask*)			# already expanded w/ netmask option
+		echo inet ${_arg%/[0-9]*} $_exargs && return
+	;;
+	*:*:*)				# already expanded w/o netmask option
+		echo inet $_arg $_exargs && return
+	;;
+	esac
+
+	for _cidr in $_arg; do
+		_ipaddr=${_cidr%%/*}
+		_plen=${_cidr##*/}
+		# When subnet prefix length is not specified, use /32.
+		case $_plen in
+		$_ipaddr)	_plen=32 ;;	# "/" character not found
+		esac
+
+		OIFS=$IFS
+		IFS=. set -- $_ipaddr
+		_range=
+		_iphead=
+		_iptail=
+		for _c in $@; do
+			case $_range:$_c in
+			:[0-9]*-[0-9]*)
+				_range=$_c
+			;;
+			:*)
+				_iphead="${_iphead}${_iphead:+.}${_c}"
+			;;
+			*:*)
+				_iptail="${_iptail}${_iptail:+.}${_c}"
+			;;
+			esac
+		done
+		IFS=$OIFS
+		_iplow=${_range%-*}
+		_iphigh=${_range#*-}
+
+		# clear netmask when removing aliases
+		if [ "$_action" = "-alias" ]; then
+			_plen=""
+		fi
+
+		_ipcount=$_iplow
+		while [ "$_ipcount" -le "$_iphigh" ]; do
+			_retstr="${_retstr} ${_iphead}${_iphead:+.}${_ipcount}${_iptail:+.}${_iptail}${_plen:+/}${_plen}"
+			if [ $_ipcount -gt $(($_iplow + $netif_ipexpand_max)) ]; then
+				warn "Range specification is too large (${_iphead}${_iphead:+.}${_iplow}${_iptail:+.}${_iptail}-${_iphead}${_iphead:+.}${_iphigh}${_iptail:+.}${_iptail}).  ${_iphead}${_iphead:+.}${_iplow}${_iptail:+.}${_iptail}-${_iphead}${_iphead:+.}${_ipcount}${_iptail:+.}${_iptail} was processed.  Increase \$netif_ipexpand_max in rc.conf."
+				break
+			else
+				_ipcount=$(($_ipcount + 1))
+			fi
+			# Forcibly set /32 for remaining aliases.
+			_plen=32
+		done
+	done
+
+	for _c in $_retstr; do
+		ifalias_expand_addr_inet $_action $_c $_exargs
+	done
+}
+
+# ifalias_expand_addr_inet6 action addr
+#	Helper function for ifalias_expand_addr().  Handles IPv6.
+#
+ifalias_expand_addr_inet6()
+{
+	local _action _arg _cidr _cidr_addr _exargs
+	local _ipaddr _plen _ipleft _ipright _iplow _iphigh _ipcount
+	local _ipv4part
+	local _retstr _c
+	_action=$1
+	_arg=$2
+	shift 2

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list