Home | History | Annotate | Line # | Download | only in postinstall
postinstall.in revision 1.46
      1   1.1  christos #!/bin/sh
      2   1.1  christos #
      3  1.46     lukem # $NetBSD: postinstall.in,v 1.46 2022/01/08 06:57:34 lukem Exp $
      4   1.1  christos #
      5  1.43     lukem # Copyright (c) 2002-2022 The NetBSD Foundation, Inc.
      6   1.1  christos # All rights reserved.
      7   1.1  christos #
      8   1.1  christos # This code is derived from software contributed to The NetBSD Foundation
      9   1.1  christos # by Luke Mewburn.
     10   1.1  christos #
     11   1.1  christos # Redistribution and use in source and binary forms, with or without
     12   1.1  christos # modification, are permitted provided that the following conditions
     13   1.1  christos # are met:
     14   1.1  christos # 1. Redistributions of source code must retain the above copyright
     15   1.1  christos #    notice, this list of conditions and the following disclaimer.
     16   1.1  christos # 2. Redistributions in binary form must reproduce the above copyright
     17   1.1  christos #    notice, this list of conditions and the following disclaimer in the
     18   1.1  christos #    documentation and/or other materials provided with the distribution.
     19   1.1  christos #
     20   1.1  christos # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21   1.1  christos # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22   1.1  christos # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23   1.1  christos # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24   1.1  christos # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25   1.1  christos # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26   1.1  christos # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27   1.1  christos # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28   1.1  christos # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29   1.1  christos # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30   1.1  christos # POSSIBILITY OF SUCH DAMAGE.
     31   1.1  christos #
     32   1.1  christos # postinstall
     33   1.1  christos #	Check for or fix configuration changes that occur
     34   1.1  christos #	over time as NetBSD evolves.
     35   1.1  christos #
     36   1.1  christos 
     37   1.1  christos #
     38  1.36     lukem # NOTE: Be sure to use ${DEST_DIR} prefix before all real file operations.
     39   1.1  christos #
     40   1.1  christos 
     41   1.1  christos #
     42   1.1  christos # checks to add:
     43   1.1  christos #	- sysctl(8) renames (net.inet6.ip6.bindv6only -> net.inet6.ip6.v6only)
     44   1.1  christos #	- de* -> tlp* migration (/etc/ifconfig.de*, $ifconfig_de*, ...) ?
     45   1.1  christos #	- support quiet/verbose mode ?
     46   1.1  christos #	- differentiate between failures caused by missing source
     47   1.1  christos #	  and real failures
     48   1.1  christos #	- install moduli into usr/share/examples/ssh and use from there?
     49   1.1  christos #	- differentiate between "needs fix" versus "can't fix" issues
     50   1.1  christos #
     51   1.1  christos 
     52   1.1  christos # This script is executed as part of a cross build.  Allow the build
     53   1.1  christos # environment to override the locations of some tools.
     54   1.1  christos : ${AWK:=awk}
     55   1.1  christos : ${DB:=db}
     56   1.1  christos : ${GREP:=grep}
     57   1.1  christos : ${HOST_SH:=sh}
     58   1.1  christos : ${MAKE:=make}
     59   1.1  christos : ${PWD_MKDB:=/usr/sbin/pwd_mkdb}
     60   1.1  christos : ${SED:=sed}
     61   1.1  christos : ${SORT:=sort}
     62   1.1  christos : ${STAT:=stat}
     63   1.1  christos 
     64   1.1  christos #
     65   1.1  christos #	helper functions
     66   1.1  christos #
     67   1.1  christos 
     68   1.1  christos err()
     69   1.1  christos {
     70   1.1  christos 	exitval=$1
     71   1.1  christos 	shift
     72   1.1  christos 	echo 1>&2 "${PROGNAME}: $*"
     73   1.1  christos 	if [ -n "${SCRATCHDIR}" ]; then
     74   1.1  christos 	    /bin/rm -rf "${SCRATCHDIR}"
     75   1.1  christos 	fi
     76   1.1  christos 	exit ${exitval}
     77   1.1  christos }
     78   1.1  christos 
     79   1.1  christos warn()
     80   1.1  christos {
     81   1.1  christos 	echo 1>&2 "${PROGNAME}: $*"
     82   1.1  christos }
     83   1.1  christos 
     84   1.1  christos msg()
     85   1.1  christos {
     86   1.1  christos 	echo "	$*"
     87   1.1  christos }
     88   1.1  christos 
     89   1.1  christos mkdtemp()
     90   1.1  christos {
     91   1.1  christos 	# Make sure we don't loop forever if mkdir will always fail.
     92   1.1  christos 	[ -d /tmp ] || err 2 /tmp is not a directory
     93   1.1  christos 	[ -w /tmp ] || err 2 /tmp is not writable
     94   1.1  christos 
     95   1.1  christos 	_base="/tmp/_postinstall.$$"
     96   1.1  christos 	_serial=0
     97   1.1  christos 
     98   1.1  christos 	while true; do
     99   1.1  christos 		_dir="${_base}.${_serial}"
    100   1.1  christos 		mkdir -m 0700 "${_dir}" && break
    101   1.1  christos 		_serial=$((${_serial} + 1))
    102   1.1  christos 	done
    103   1.1  christos 	echo "${_dir}"
    104   1.1  christos }
    105   1.1  christos 
    106   1.1  christos # Quote args to make them safe in the shell.
    107   1.1  christos # Usage: quotedlist="$(shell_quote args...)"
    108   1.1  christos #
    109   1.1  christos # After building up a quoted list, use it by evaling it inside
    110   1.1  christos # double quotes, like this:
    111   1.1  christos #    eval "set -- $quotedlist"
    112   1.1  christos # or like this:
    113   1.1  christos #    eval "\$command $quotedlist \$filename"
    114   1.1  christos #
    115   1.1  christos shell_quote()
    116   1.1  christos {(
    117   1.1  christos 	local result=''
    118   1.1  christos 	local arg qarg
    119   1.1  christos 	LC_COLLATE=C ; export LC_COLLATE # so [a-zA-Z0-9] works in ASCII
    120   1.1  christos 	for arg in "$@" ; do
    121   1.1  christos 		case "${arg}" in
    122   1.1  christos 		'')
    123   1.1  christos 			qarg="''"
    124   1.1  christos 			;;
    125   1.1  christos 		*[!-./a-zA-Z0-9]*)
    126   1.1  christos 			# Convert each embedded ' to '\'',
    127   1.1  christos 			# then insert ' at the beginning of the first line,
    128   1.1  christos 			# and append ' at the end of the last line.
    129   1.1  christos 			# Finally, elide unnecessary '' pairs at the
    130   1.1  christos 			# beginning and end of the result and as part of
    131   1.1  christos 			# '\'''\'' sequences that result from multiple
    132   1.1  christos 			# adjacent quotes in he input.
    133   1.1  christos 			qarg="$(printf "%s\n" "$arg" | \
    134   1.1  christos 			    ${SED:-sed} -e "s/'/'\\\\''/g" \
    135   1.1  christos 				-e "1s/^/'/" -e "\$s/\$/'/" \
    136   1.1  christos 				-e "1s/^''//" -e "\$s/''\$//" \
    137   1.1  christos 				-e "s/'''/'/g"
    138   1.1  christos 				)"
    139   1.1  christos 			;;
    140   1.1  christos 		*)
    141   1.1  christos 			# Arg is not the empty string, and does not contain
    142   1.1  christos 			# any unsafe characters.  Leave it unchanged for
    143   1.1  christos 			# readability.
    144   1.1  christos 			qarg="${arg}"
    145   1.1  christos 			;;
    146   1.1  christos 		esac
    147   1.1  christos 		result="${result}${result:+ }${qarg}"
    148   1.1  christos 	done
    149   1.1  christos 	printf "%s\n" "$result"
    150   1.1  christos )}
    151   1.1  christos 
    152   1.1  christos # Convert arg $1 to a basic regular expression (as in sed)
    153   1.1  christos # that will match the arg.  This works by inserting backslashes
    154   1.1  christos # before characters that are special in basic regular expressions.
    155   1.1  christos # It also inserts backslashes before the extra characters specified
    156   1.1  christos # in $2 (which defaults to "/,").
    157   1.1  christos # XXX: Does not handle embedded newlines.
    158   1.1  christos # Usage: regex="$(bre_quote "${string}")"
    159   1.1  christos bre_quote()
    160   1.1  christos {
    161   1.1  christos 	local arg="$1"
    162   1.1  christos 	local extra="${2-/,}"
    163   1.1  christos 	printf "%s\n" "${arg}" | ${SED} -e 's/[][^$.*\\'"${extra}"']/\\&/g'
    164   1.1  christos }
    165   1.1  christos 
    166   1.1  christos # unprefix dir
    167   1.1  christos #	Remove any dir prefix from a list of paths on stdin,
    168   1.1  christos #	and write the result to stdout.  Useful for converting
    169   1.1  christos #	from ${DEST_DIR}/path to /path.
    170   1.1  christos #
    171   1.1  christos unprefix()
    172   1.1  christos {
    173   1.1  christos 	[ $# -eq 1 ] || err 3 "USAGE: unprefix dir"
    174   1.1  christos 	local prefix="${1%/}"
    175   1.1  christos 	prefix="$(bre_quote "${prefix}")"
    176   1.1  christos 
    177   1.1  christos 	${SED} -e "s,^${prefix}/,/,"
    178   1.1  christos }
    179   1.1  christos 
    180   1.1  christos # additem item description
    181   1.1  christos #	Add item to list of supported items to check/fix,
    182   1.1  christos #	which are checked/fixed by default if no item is requested by user.
    183   1.1  christos #
    184   1.1  christos additem()
    185   1.1  christos {
    186   1.1  christos 	[ $# -eq 2 ] || err 3 "USAGE: additem item description"
    187   1.1  christos 	defaultitems="${defaultitems}${defaultitems:+ }$1"
    188   1.1  christos 	eval desc_$1=\"\$2\"
    189   1.1  christos }
    190   1.1  christos 
    191   1.1  christos # adddisableditem item description
    192   1.1  christos #	Add item to list of supported items to check/fix,
    193   1.1  christos #	but execute the item only if the user asks for it explicitly.
    194   1.1  christos #
    195   1.1  christos adddisableditem()
    196   1.1  christos {
    197   1.1  christos 	[ $# -eq 2 ] || err 3 "USAGE: adddisableditem item description"
    198   1.1  christos 	otheritems="${otheritems}${otheritems:+ }$1"
    199   1.1  christos 	eval desc_$1=\"\$2\"
    200   1.1  christos }
    201   1.1  christos 
    202   1.1  christos # checkdir op dir mode
    203   1.1  christos #	Ensure dir exists, and if not, create it with the appropriate mode.
    204   1.1  christos #	Returns 0 if ok, 1 otherwise.
    205   1.1  christos #
    206   1.1  christos check_dir()
    207   1.1  christos {
    208   1.1  christos 	[ $# -eq 3 ] || err 3 "USAGE: check_dir op dir mode"
    209   1.1  christos 	_cdop="$1"
    210   1.1  christos 	_cddir="$2"
    211   1.1  christos 	_cdmode="$3"
    212   1.1  christos 	[ -d "${_cddir}" ] && return 0
    213   1.1  christos 	if [ "${_cdop}" = "check" ]; then
    214   1.1  christos 		msg "${_cddir} is not a directory"
    215   1.1  christos 		return 1
    216   1.1  christos 	elif ! mkdir -m "${_cdmode}" "${_cddir}" ; then
    217   1.1  christos 		msg "Can't create missing ${_cddir}"
    218   1.1  christos 		return 1
    219   1.1  christos 	else
    220   1.1  christos 		msg "Missing ${_cddir} created"
    221   1.1  christos 	fi
    222   1.1  christos 	return 0
    223   1.1  christos }
    224   1.1  christos 
    225  1.44     lukem # check_ids op type file srcfile start id ...
    226   1.1  christos #	Check if file of type "users" or "groups" contains the relevant IDs.
    227   1.1  christos #	Use srcfile as a reference for the expected contents.
    228   1.1  christos #	The specified "id" names should be given in numerical order,
    229   1.1  christos #	with the first name corresponding to numerical value "start",
    230   1.1  christos #	and with the special name "SKIP" being used to mark gaps in the
    231   1.1  christos #	sequence.
    232   1.1  christos #	Returns 0 if ok, 1 otherwise.
    233   1.1  christos #
    234   1.1  christos check_ids()
    235   1.1  christos {
    236  1.44     lukem 	[ $# -ge 6 ] || err 3 "USAGE: checks_ids op type file start srcfile id ..."
    237   1.1  christos 	_op="$1"
    238   1.1  christos 	_type="$2"
    239   1.1  christos 	_file="$3"
    240   1.1  christos 	_srcfile="$4"
    241   1.1  christos 	_start="$5"
    242   1.1  christos 	shift 5
    243   1.1  christos 	#_ids="$@"
    244   1.1  christos 
    245   1.1  christos 	if [ ! -f "${_file}" ]; then
    246   1.1  christos 		msg "${_file} doesn't exist; can't check for missing ${_type}"
    247   1.1  christos 		return 1
    248   1.1  christos 	fi
    249   1.1  christos 	if [ ! -r "${_file}" ]; then
    250   1.1  christos 		msg "${_file} is not readable; can't check for missing ${_type}"
    251   1.1  christos 		return 1
    252   1.1  christos 	fi
    253   1.1  christos 	_notfixed=""
    254   1.1  christos 	if [ "${_op}" = "fix" ]; then
    255   1.1  christos 		_notfixed="${NOT_FIXED}"
    256   1.1  christos 	fi
    257   1.1  christos 	_missing="$(${AWK} -v start=$_start -F: '
    258   1.1  christos 		BEGIN {
    259   1.1  christos 			for (x = 1; x < ARGC; x++) {
    260   1.1  christos 				if (ARGV[x] == "SKIP")
    261   1.1  christos 					continue;
    262   1.1  christos 				idlist[ARGV[x]]++;
    263   1.1  christos 				value[ARGV[x]] = start + x - 1;
    264   1.1  christos 			}
    265   1.1  christos 			ARGC=1
    266   1.1  christos 		}
    267   1.1  christos 		{
    268   1.1  christos 			found[$1]++
    269   1.1  christos 			number[$1] = $3
    270   1.1  christos 		}
    271   1.1  christos 		END {
    272   1.1  christos 			for (id in idlist) {
    273   1.1  christos 				if (!(id in found))
    274   1.1  christos 					printf("%s (missing)\n", id)
    275   1.1  christos 				else if (number[id] != value[id])
    276   1.1  christos 					printf("%s (%d != %d)\n", id,
    277   1.1  christos 					    number[id], value[id])
    278   1.1  christos 				start++;
    279   1.1  christos 			}
    280   1.1  christos 		}
    281   1.1  christos 	' "$@" < "${_file}")"	|| return 1
    282   1.1  christos 	if [ -n "${_missing}" ]; then
    283   1.1  christos 		msg "Error ${_type}${_notfixed}:" $(echo ${_missing})
    284   1.1  christos 		msg "Use the following as a template:"
    285   1.1  christos 		set -- ${_missing}
    286   1.1  christos 		while [ $# -gt 0 ]
    287   1.1  christos 		do
    288   1.1  christos 			${GREP} -E "^${1}:" ${_srcfile}
    289   1.1  christos 			shift 2
    290  1.31    simonb 		done | sort -t: -k3n
    291   1.1  christos 		msg "and adjust if necessary."
    292   1.1  christos 		return 1
    293   1.1  christos 	fi
    294   1.1  christos 	return 0
    295   1.1  christos }
    296   1.1  christos 
    297  1.44     lukem # populate_dir op onlynew src dest mode file ...
    298   1.1  christos #	Perform op ("check" or "fix") on files in src/ against dest/
    299   1.1  christos #	If op = "check" display missing or changed files, optionally with diffs.
    300   1.1  christos #	If op != "check" copies any missing or changed files.
    301   1.1  christos #	If onlynew evaluates to true, changed files are ignored.
    302   1.1  christos #	Returns 0 if ok, 1 otherwise.
    303   1.1  christos #
    304   1.1  christos populate_dir()
    305   1.1  christos {
    306  1.44     lukem 	[ $# -ge 5 ] || err 3 "USAGE: populate_dir op onlynew src dest mode file ..."
    307   1.1  christos 	_op="$1"
    308   1.1  christos 	_onlynew="$2"
    309   1.1  christos 	_src="$3"
    310   1.1  christos 	_dest="$4"
    311   1.1  christos 	_mode="$5"
    312   1.1  christos 	shift 5
    313   1.1  christos 	#_files="$@"
    314   1.1  christos 
    315   1.1  christos 	if [ ! -d "${_src}" ]; then
    316   1.1  christos 		msg "${_src} is not a directory; skipping check"
    317   1.1  christos 		return 1
    318   1.1  christos 	fi
    319   1.1  christos 	check_dir "${_op}" "${_dest}" 755 || return 1
    320   1.1  christos 
    321   1.1  christos 	_cmpdir_rv=0
    322   1.1  christos 	for f in "$@"; do
    323   1.1  christos 		fs="${_src}/${f}"
    324   1.1  christos 		fd="${_dest}/${f}"
    325   1.1  christos 		_error=""
    326   1.1  christos 		if [ ! -f "${fd}" ]; then
    327   1.1  christos 			_error="${fd} does not exist"
    328   1.1  christos 		elif ! cmp -s "${fs}" "${fd}" ; then
    329   1.1  christos 			if $_onlynew; then	# leave existing ${fd} alone
    330   1.1  christos 				continue;
    331   1.1  christos 			fi
    332   1.1  christos 			_error="${fs} != ${fd}"
    333   1.1  christos 		else
    334   1.1  christos 			continue
    335   1.1  christos 		fi
    336   1.1  christos 		if [ "${_op}" = "check" ]; then
    337   1.1  christos 			msg "${_error}"
    338   1.1  christos 			if [ -n "${DIFF_STYLE}" -a -f "${fd}" ]; then
    339   1.1  christos 				diff -${DIFF_STYLE} ${DIFF_OPT} "${fd}" "${fs}"
    340   1.1  christos 			fi
    341   1.1  christos 			_cmpdir_rv=1
    342   1.1  christos 		elif ! rm -f "${fd}" ||
    343   1.1  christos 		     ! cp -f "${fs}" "${fd}"; then
    344   1.1  christos 			msg "Can't copy ${fs} to ${fd}"
    345   1.1  christos 			_cmpdir_rv=1
    346   1.1  christos 		elif ! chmod "${_mode}" "${fd}"; then
    347   1.1  christos 			msg "Can't change mode of ${fd} to ${_mode}"
    348   1.1  christos 			_cmpdir_rv=1
    349   1.1  christos 		else
    350   1.1  christos 			msg "Copied ${fs} to ${fd}"
    351   1.1  christos 		fi
    352   1.1  christos 	done
    353   1.1  christos 	return ${_cmpdir_rv}
    354   1.1  christos }
    355   1.1  christos 
    356  1.44     lukem # compare_dir op src dest mode file ...
    357   1.1  christos #	Perform op ("check" or "fix") on files in src/ against dest/
    358   1.1  christos #	If op = "check" display missing or changed files, optionally with diffs.
    359   1.1  christos #	If op != "check" copies any missing or changed files.
    360   1.1  christos #	Returns 0 if ok, 1 otherwise.
    361   1.1  christos #
    362   1.1  christos compare_dir()
    363   1.1  christos {
    364  1.44     lukem 	[ $# -ge 4 ] || err 3 "USAGE: compare_dir op src dest mode file ..."
    365   1.1  christos 	_op="$1"
    366   1.1  christos 	_src="$2"
    367   1.1  christos 	_dest="$3"
    368   1.1  christos 	_mode="$4"
    369   1.1  christos 	shift 4
    370   1.1  christos 	#_files="$@"
    371   1.1  christos 
    372   1.1  christos 	populate_dir "$_op" false "$_src" "$_dest" "$_mode" "$@"
    373   1.1  christos }
    374   1.1  christos 
    375   1.1  christos # move_file op src dest --
    376   1.1  christos #	Check (op == "check") or move (op != "check") from src to dest.
    377   1.1  christos #	Returns 0 if ok, 1 otherwise.
    378   1.1  christos #
    379   1.1  christos move_file()
    380   1.1  christos {
    381   1.1  christos 	[ $# -eq 3 ] || err 3 "USAGE: move_file op src dest"
    382   1.1  christos 	_fm_op="$1"
    383   1.1  christos 	_fm_src="$2"
    384   1.1  christos 	_fm_dest="$3"
    385   1.1  christos 
    386   1.1  christos 	if [ -f "${_fm_src}" -a ! -f "${_fm_dest}" ]; then
    387   1.1  christos 		if [ "${_fm_op}" = "check" ]; then
    388   1.1  christos 			msg "Move ${_fm_src} to ${_fm_dest}"
    389   1.1  christos 			return 1
    390   1.1  christos 		fi
    391   1.1  christos 		if ! mv "${_fm_src}" "${_fm_dest}"; then
    392   1.1  christos 			msg "Can't move ${_fm_src} to ${_fm_dest}"
    393   1.1  christos 			return 1
    394   1.1  christos 		fi
    395   1.1  christos 		msg "Moved ${_fm_src} to ${_fm_dest}"
    396   1.1  christos 	fi
    397   1.1  christos 	return 0
    398   1.1  christos }
    399   1.1  christos 
    400   1.1  christos # rcconf_is_set op name var [verbose] --
    401   1.1  christos #	Load the rcconf for name, and check if obsolete rc.conf(5) variable
    402   1.1  christos #	var is defined or not.
    403   1.1  christos #	Returns 0 if defined (even to ""), otherwise 1.
    404   1.1  christos #	If verbose != "", print an obsolete warning if the var is defined.
    405   1.1  christos #
    406   1.1  christos rcconf_is_set()
    407   1.1  christos {
    408   1.1  christos 	[ $# -ge 3 ] || err 3 "USAGE: rcconf_is_set op name var [verbose]"
    409   1.1  christos 	_rcis_op="$1"
    410   1.1  christos 	_rcis_name="$2"
    411   1.1  christos 	_rcis_var="$3"
    412   1.1  christos 	_rcis_verbose="$4"
    413   1.1  christos 	_rcis_notfixed=""
    414   1.1  christos 	if [ "${_rcis_op}" = "fix" ]; then
    415   1.1  christos 		_rcis_notfixed="${NOT_FIXED}"
    416   1.1  christos 	fi
    417   1.1  christos 	(
    418   1.1  christos 		for f in \
    419   1.1  christos 		    "${DEST_DIR}/etc/rc.conf" \
    420   1.1  christos 		    "${DEST_DIR}/etc/rc.conf.d/${_rcis_name}"; do
    421   1.1  christos 			[ -f "${f}" ] && . "${f}"
    422   1.1  christos 		done
    423   1.1  christos 		eval echo -n \"\${${_rcis_var}}\" 1>&3
    424   1.1  christos 		if eval "[ -n \"\${${_rcis_var}}\" \
    425   1.1  christos 			    -o \"\${${_rcis_var}-UNSET}\" != \"UNSET\" ]"; then
    426   1.1  christos 			if [ -n "${_rcis_verbose}" ]; then
    427   1.1  christos 				msg \
    428   1.1  christos     "Obsolete rc.conf(5) variable '\$${_rcis_var}' found.${_rcis_notfixed}"
    429   1.1  christos 			fi
    430   1.1  christos 			exit 0
    431   1.1  christos 		else
    432   1.1  christos 			exit 1
    433   1.1  christos 		fi
    434   1.1  christos 	)
    435   1.1  christos }
    436   1.1  christos 
    437   1.1  christos # rcvar_is_enabled var
    438   1.1  christos #	Check if rcvar is enabled
    439   1.1  christos #
    440   1.1  christos rcvar_is_enabled()
    441   1.1  christos {
    442   1.1  christos 	[ $# -eq 1 ] || err 3 "USAGE: rcvar_is_enabled var"
    443   1.1  christos 	_rcie_var="$1"
    444   1.1  christos 	(
    445   1.1  christos 		[ -f "${DEST_DIR}/etc/rc.conf" ] && . "${DEST_DIR}/etc/rc.conf"
    446   1.1  christos 		eval _rcie_val=\"\${${_rcie_var}}\"
    447   1.1  christos 		case $_rcie_val in
    448   1.1  christos 		#	"yes", "true", "on", or "1"
    449   1.1  christos 		[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
    450   1.1  christos 			exit 0
    451   1.1  christos 			;;
    452   1.1  christos 
    453   1.1  christos 		*)
    454   1.1  christos 			exit 1
    455   1.1  christos 			;;
    456   1.1  christos 		esac
    457   1.1  christos 	)
    458   1.1  christos }
    459   1.1  christos 
    460  1.44     lukem # find_file_in_dirlist() file message dir1 ... --
    461   1.1  christos #	Find which directory file is in, and sets ${dir} to match.
    462   1.1  christos #	Returns 0 if matched, otherwise 1 (and sets ${dir} to "").
    463   1.1  christos #
    464   1.1  christos #	Generally, check the directory for the "checking from source" case,
    465   1.1  christos #	and then the directory for the "checking from extracted etc.tgz" case.
    466   1.1  christos #
    467   1.1  christos find_file_in_dirlist()
    468   1.1  christos {
    469  1.44     lukem 	[ $# -ge 3 ] || err 3 "USAGE: find_file_in_dirlist file msg dir1 ..."
    470   1.1  christos 
    471   1.1  christos 	_file="$1" ; shift
    472   1.1  christos 	_msg="$1" ; shift
    473   1.1  christos 	_dir1st=	# first dir in list
    474   1.1  christos 	for dir in "$@"; do
    475   1.1  christos 		: ${_dir1st:="${dir}"}
    476   1.1  christos 		if [ -f "${dir}/${_file}" ]; then
    477   1.1  christos 			if [ "${_dir1st}" != "${dir}" ]; then
    478   1.1  christos 				msg \
    479   1.1  christos     "(Checking for ${_msg} from ${dir} instead of ${_dir1st})"
    480   1.1  christos 			fi
    481   1.1  christos 			return 0
    482   1.1  christos 		fi
    483   1.1  christos 	done
    484   1.1  christos 	msg "Can't find source directory for ${_msg}"
    485   1.1  christos 	return 1
    486   1.1  christos }
    487   1.1  christos 
    488   1.1  christos # file_exists_exact path
    489   1.1  christos #	Returns true if a file exists in the ${DEST_DIR} whose name
    490   1.1  christos #	is exactly ${path}, interpreted in a case-sensitive way
    491   1.1  christos #	even if the underlying file system is case-insensitive.
    492   1.1  christos #
    493   1.1  christos #	The path must begin with '/' or './', and is interpreted as
    494   1.1  christos #	being relative to ${DEST_DIR}.
    495   1.1  christos #
    496   1.1  christos file_exists_exact()
    497   1.1  christos {
    498   1.1  christos 	[ -n "$1" ] || err 3 "USAGE: file_exists_exact path"
    499   1.1  christos 	_path="${1#.}"
    500   1.1  christos 	[ -h "${DEST_DIR}${_path}" ] || \
    501   1.1  christos 		[ -e "${DEST_DIR}${_path}" ] || return 1
    502   1.1  christos 	while [ "${_path}" != "/" -a "${_path}" != "." ] ; do
    503   1.1  christos 		_dirname="$(dirname "${_path}" 2>/dev/null)"
    504   1.1  christos 		_basename="$(basename "${_path}" 2>/dev/null)"
    505   1.1  christos 		ls -fa "${DEST_DIR}${_dirname}" 2> /dev/null \
    506   1.1  christos 			| ${GREP} -F -x "${_basename}" >/dev/null \
    507   1.1  christos 			|| return 1
    508   1.1  christos 		_path="${_dirname}"
    509   1.1  christos 	done
    510   1.1  christos 	return 0
    511   1.1  christos }
    512   1.1  christos 
    513   1.1  christos # obsolete_paths op
    514   1.1  christos #	Obsolete the list of paths provided on stdin.
    515   1.1  christos #	Each path should start with '/' or './', and
    516   1.1  christos #	will be interpreted relative to ${DEST_DIR}.
    517   1.1  christos #
    518   1.1  christos obsolete_paths()
    519   1.1  christos {
    520  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: obsolete_paths fix|check"
    521   1.1  christos 	op="$1"
    522   1.1  christos 
    523   1.1  christos 	failed=0
    524   1.1  christos 	while read ofile; do
    525   1.1  christos 		if ! ${file_exists_exact} "${ofile}"; then
    526   1.1  christos 			continue
    527   1.1  christos 		fi
    528   1.1  christos 		ofile="${DEST_DIR}${ofile#.}"
    529   1.1  christos 		cmd="rm"
    530   1.1  christos 		ftype="file"
    531   1.1  christos 		if [ -h "${ofile}" ]; then
    532   1.1  christos 			ftype="link"
    533   1.1  christos 		elif [ -d "${ofile}" ]; then
    534   1.1  christos 			ftype="directory"
    535   1.1  christos 			cmd="rmdir"
    536   1.1  christos 		elif [ ! -e "${ofile}" ]; then
    537   1.1  christos 			continue
    538   1.1  christos 		fi
    539   1.1  christos 		if [ "${op}" = "check" ]; then
    540   1.1  christos 			msg "Remove obsolete ${ftype} ${ofile}"
    541   1.1  christos 			failed=1
    542   1.1  christos 		elif ! eval "${cmd} \"\${ofile}\""; then
    543   1.1  christos 			msg "Can't remove obsolete ${ftype} ${ofile}"
    544   1.1  christos 			failed=1
    545   1.1  christos 		else
    546   1.1  christos 			msg "Removed obsolete ${ftype} ${ofile}"
    547   1.1  christos 		fi
    548   1.1  christos 	done
    549   1.1  christos 	return ${failed}
    550   1.1  christos }
    551   1.1  christos 
    552   1.1  christos # obsolete_libs dir
    553   1.1  christos #	Display the minor/teeny shared libraries in dir that are considered
    554   1.1  christos #	to be obsolete.
    555   1.1  christos #
    556   1.1  christos #	The implementation supports removing obsolete major libraries
    557   1.1  christos #	if the awk variable AllLibs is set, although there is no way to
    558   1.1  christos #	enable that in the enclosing shell function as this time.
    559   1.1  christos #
    560   1.1  christos obsolete_libs()
    561   1.1  christos {
    562   1.1  christos 	[ $# -eq 1 ] || err 3 "USAGE: obsolete_libs dir"
    563   1.1  christos 	dir="$1"
    564   1.1  christos 
    565   1.1  christos 	_obsolete_libs "${dir}"
    566   1.1  christos 	_obsolete_libs "/usr/libdata/debug/${dir}"
    567   1.1  christos }
    568   1.1  christos 
    569   1.5  christos exclude()
    570   1.5  christos {
    571   1.5  christos 	local dollar
    572   1.5  christos 	case "$1" in
    573   1.5  christos 	-t)
    574   1.5  christos 		dollar='$'
    575   1.5  christos 		shift
    576   1.5  christos 		;;
    577   1.5  christos 	*)
    578   1.5  christos 		dollar=
    579   1.5  christos 		;;
    580   1.5  christos 	esac
    581   1.5  christos 	if [ -z "$*" ]; then
    582   1.5  christos 		cat
    583   1.5  christos 	else
    584   1.5  christos 		eval ${GREP} -v -E "'(^$(echo $* | \
    585   1.5  christos 		    ${SED} -e s/\\./\\\\./g -e 's/ /'${dollar}'|^/'g)${dollar})'"
    586   1.5  christos 	fi
    587   1.5  christos }
    588   1.5  christos 
    589   1.5  christos #
    590   1.5  christos # find all the target symlinks of shared libaries and exclude them
    591   1.5  christos # from consideration for removal
    592   1.5  christos #
    593  1.37     lukem exclude_libs()
    594  1.37     lukem {
    595   1.6       uwe 	local target="$(ls -l -d lib*.so.* 2> /dev/null \
    596   1.5  christos 	    | ${AWK} '{ print $11; }' \
    597   1.5  christos 	    | ${SED} -e 's@.*/@@' | ${SORT} -u)"
    598   1.5  christos 	exclude -t ${target}
    599   1.5  christos }
    600   1.5  christos 
    601   1.1  christos _obsolete_libs()
    602   1.1  christos {
    603   1.1  christos 	dir="$1"
    604   1.1  christos 
    605   1.1  christos 	(
    606   1.1  christos 
    607   1.1  christos 	if [ ! -e "${DEST_DIR}/${dir}" ]
    608   1.1  christos 	then
    609   1.1  christos 		return 0
    610   1.1  christos 	fi
    611   1.1  christos 
    612   1.1  christos 	cd "${DEST_DIR}/${dir}" || err 2 "can't cd to ${DEST_DIR}/${dir}"
    613   1.1  christos 	echo lib*.so.* \
    614   1.1  christos 	| tr ' ' '\n' \
    615   1.1  christos 	| ${AWK} -v LibDir="${dir}/" '
    616   1.1  christos #{
    617   1.1  christos 
    618   1.1  christos function digit(v, c, n) { return (n <= c) ? v[n] : 0 }
    619   1.1  christos 
    620   1.1  christos function checklib(results, line, regex) {
    621   1.1  christos 	if (! match(line, regex))
    622   1.1  christos 		return
    623   1.1  christos 	lib = substr(line, RSTART, RLENGTH)
    624   1.1  christos 	rev = substr($0, RLENGTH+1)
    625   1.1  christos 	if (! (lib in results)) {
    626   1.1  christos 		results[lib] = rev
    627   1.1  christos 		return
    628   1.1  christos 	}
    629   1.1  christos 	orevc = split(results[lib], orev, ".")
    630   1.1  christos 	nrevc = split(rev, nrev, ".")
    631   1.1  christos 	maxc = (orevc > nrevc) ? orevc : nrevc
    632   1.1  christos 	for (i = 1; i <= maxc; i++) {
    633   1.1  christos 		res = digit(orev, orevc, i) - digit(nrev, nrevc, i)
    634   1.1  christos 		if (res < 0) {
    635   1.1  christos 			print LibDir lib results[lib]
    636   1.1  christos 			results[lib] = rev
    637   1.1  christos 			return
    638   1.1  christos 		} else if (res > 0) {
    639   1.1  christos 			print LibDir lib rev
    640   1.1  christos 			return
    641   1.1  christos 		}
    642   1.1  christos 	}
    643   1.1  christos }
    644   1.1  christos 
    645   1.1  christos /^lib.*\.so\.[0-9]+\.[0-9]+(\.[0-9]+)?(\.debug)?$/ {
    646   1.1  christos 	if (AllLibs)
    647   1.1  christos 		checklib(minor, $0, "^lib.*\\.so\\.")
    648   1.1  christos 	else
    649   1.1  christos 		checklib(found, $0, "^lib.*\\.so\\.[0-9]+\\.")
    650   1.1  christos }
    651   1.1  christos 
    652   1.1  christos /^lib.*\.so\.[0-9]+$/ {
    653   1.1  christos 	if (AllLibs)
    654   1.1  christos 		checklib(major, $0, "^lib.*\\.so\\.")
    655   1.1  christos }
    656   1.1  christos 
    657   1.5  christos #}' | exclude_libs
    658   1.1  christos 
    659   1.1  christos 	)
    660   1.1  christos }
    661   1.1  christos 
    662   1.1  christos # obsolete_stand dir
    663   1.1  christos #	Prints the names of all obsolete files and subdirs below the
    664   1.1  christos #	provided dir.  dir should be something like /stand/${MACHINE}.
    665   1.1  christos #	The input dir and all output paths are interpreted
    666   1.1  christos #	relative to ${DEST_DIR}.
    667   1.1  christos #
    668   1.1  christos #	Assumes that the numerically largest subdir is current, and all
    669   1.1  christos #	others are obsolete.
    670   1.1  christos #
    671   1.1  christos obsolete_stand()
    672   1.1  christos {
    673   1.1  christos 	[ $# -eq 1 ] || err 3 "USAGE: obsolete_stand dir"
    674   1.1  christos 	local dir="$1"
    675   1.1  christos 	local subdir
    676   1.1  christos 
    677   1.1  christos 	if ! [ -d "${DEST_DIR}${dir}" ]; then
    678   1.1  christos 		msg "${DEST_DIR}${dir} doesn't exist; can't check for obsolete files"
    679   1.1  christos 		return 1
    680   1.1  christos 	fi
    681   1.1  christos 
    682   1.1  christos 	( cd "${DEST_DIR}${dir}" && ls -1d [0-9]*[0-9]/. ) \
    683   1.1  christos 	| ${GREP} -v '[^0-9./]' \
    684   1.1  christos 	| sort -t. -r -n -k1,1 -k2,2 -k3,3 \
    685   1.1  christos 	| tail -n +2 \
    686   1.1  christos 	| while read subdir ; do
    687   1.1  christos 		subdir="${subdir%/.}"
    688   1.1  christos 		find "${DEST_DIR}${dir}/${subdir}" -depth -print
    689   1.1  christos 	done \
    690   1.1  christos 	| unprefix "${DEST_DIR}"
    691   1.1  christos }
    692   1.1  christos 
    693   1.1  christos # modify_file op srcfile scratchfile awkprog
    694   1.1  christos #	Apply awkprog to srcfile sending output to scratchfile, and
    695   1.1  christos #	if appropriate replace srcfile with scratchfile.
    696   1.1  christos #
    697   1.1  christos modify_file()
    698   1.1  christos {
    699   1.1  christos 	[ $# -eq 4 ] || err 3 "USAGE: modify_file op file scratch awkprog"
    700   1.1  christos 
    701   1.1  christos 	_mfop="$1"
    702   1.1  christos 	_mffile="$2"
    703   1.1  christos 	_mfscratch="$3"
    704   1.1  christos 	_mfprog="$4"
    705   1.1  christos 	_mffailed=0
    706   1.1  christos 
    707   1.1  christos 	${AWK} "${_mfprog}" < "${_mffile}" > "${_mfscratch}"
    708   1.1  christos 	if ! cmp -s "${_mffile}" "${_mfscratch}"; then
    709   1.1  christos 		diff "${_mffile}" "${_mfscratch}" > "${_mfscratch}.diffs"
    710   1.1  christos 		if [ "${_mfop}" = "check" ]; then
    711   1.1  christos 			msg "${_mffile} needs the following changes:"
    712   1.1  christos 			_mffailed=1
    713   1.1  christos 		elif ! rm -f "${_mffile}" ||
    714   1.1  christos 		     ! cp -f "${_mfscratch}" "${_mffile}"; then
    715   1.1  christos 			msg "${_mffile} changes not applied:"
    716   1.1  christos 			_mffailed=1
    717   1.1  christos 		else
    718   1.1  christos 			msg "${_mffile} changes applied:"
    719   1.1  christos 		fi
    720   1.1  christos 		while read _line; do
    721   1.1  christos 			msg "	${_line}"
    722   1.1  christos 		done < "${_mfscratch}.diffs"
    723   1.1  christos 	fi
    724   1.1  christos 	return ${_mffailed}
    725   1.1  christos }
    726   1.1  christos 
    727   1.1  christos 
    728   1.1  christos # contents_owner op directory user group
    729   1.1  christos #	Make sure directory and contents are owned (and group-owned)
    730   1.1  christos #	as specified.
    731   1.1  christos #
    732   1.1  christos contents_owner()
    733   1.1  christos {
    734   1.1  christos 	[ $# -eq 4 ] || err 3 "USAGE: contents_owner op dir user group"
    735   1.1  christos 
    736   1.1  christos 	_op="$1"
    737   1.1  christos 	_dir="$2"
    738   1.1  christos 	_user="$3"
    739   1.1  christos 	_grp="$4"
    740   1.1  christos 
    741   1.1  christos 	if [ "${_op}" = "check" ]; then
    742  1.18       roy 		_files=$(find "${_dir}" \( \( ! -user "${_user}" \) -o \
    743  1.18       roy 		                \( ! -group "${_grp}" \) \) )
    744  1.18       roy 		_error=$?
    745  1.18       roy 		if [ ! -z "$_files" ] || [ $_error != 0 ]; then
    746  1.18       roy 			msg "${_dir} and contents not all owned by" \
    747  1.18       roy 			    "${_user}:${_grp}"
    748   1.1  christos 			return 1
    749   1.1  christos 		else
    750   1.1  christos 			return 0
    751   1.1  christos 		fi
    752   1.1  christos 	elif [ "${_op}" = "fix" ]; then
    753   1.1  christos 		find "${_dir}" \( \( ! -user "${_user}" \) -o \
    754  1.20       roy 		\( ! -group "${_grp}" \) \) \
    755  1.20       roy 		-exec chown "${_user}:${_grp}" -- {} \;
    756   1.1  christos 	fi
    757   1.1  christos }
    758   1.1  christos 
    759  1.44     lukem # get_makevar var ...
    760   1.1  christos #	Retrieve the value of a user-settable system make variable
    761   1.1  christos get_makevar()
    762   1.1  christos {
    763   1.1  christos 	$SOURCEMODE || err 3 "get_makevar must be used in source mode"
    764  1.44     lukem 	[ $# -eq 0 ] && err 3 "USAGE: get_makevar var ..."
    765   1.1  christos 
    766   1.1  christos 	for _var in "$@"; do
    767   1.1  christos 		_value="$(echo '.include <bsd.own.mk>' | \
    768   1.1  christos 		    ${MAKE} -f - -V "\${${_var}}")"
    769   1.1  christos 
    770   1.1  christos 		eval ${_var}=\"\${_value}\"
    771   1.1  christos 	done
    772   1.1  christos }
    773   1.1  christos 
    774   1.1  christos # detect_x11
    775   1.1  christos #	Detect if X11 components should be analysed and set values of
    776   1.1  christos #	relevant variables.
    777   1.1  christos detect_x11()
    778   1.1  christos {
    779   1.1  christos 	if $SOURCEMODE; then
    780   1.1  christos 		get_makevar MKX11 X11ROOTDIR X11SRCDIR
    781   1.1  christos 	else
    782   1.1  christos 		if [ -f "${SRC_DIR}/etc/mtree/set.xetc" ]; then
    783   1.1  christos 			MKX11=yes
    784   1.1  christos 			X11ROOTDIR=/this/value/isnt/used/yet
    785   1.1  christos 		else
    786   1.1  christos 			MKX11=no
    787   1.1  christos 			X11ROOTDIR=
    788   1.1  christos 		fi
    789   1.1  christos 		X11SRCDIR=/nonexistent/xsrc
    790   1.1  christos 	fi
    791   1.1  christos }
    792   1.1  christos 
    793   1.1  christos #
    794   1.1  christos #	find out where MAKEDEV lives, set MAKEDEV_DIR appropriately
    795   1.1  christos #
    796   1.1  christos find_makedev()
    797   1.1  christos {
    798   1.1  christos 	if [ -e "${DEST_DIR}/dev/MAKEDEV" ]; then
    799   1.1  christos 		MAKEDEV_DIR="${DEST_DIR}/dev"
    800   1.1  christos 	elif [ -e "${DEST_DIR}/etc/MAKEDEV" ]; then
    801   1.1  christos 		MAKEDEV_DIR="${DEST_DIR}/etc"
    802   1.1  christos 	else
    803   1.1  christos 		MAKEDEV_DIR="${DEST_DIR}/dev"
    804   1.1  christos 	fi
    805   1.1  christos }
    806   1.1  christos 
    807   1.1  christos 
    808   1.1  christos #
    809   1.1  christos #	items
    810   1.1  christos #	-----
    811   1.1  christos #
    812  1.37     lukem # NOTE: Keep these items sorted, except for obsolete* which are listed last.
    813  1.37     lukem #
    814   1.1  christos 
    815   1.1  christos #
    816  1.37     lukem #	atf
    817   1.1  christos #
    818   1.1  christos 
    819  1.37     lukem handle_atf_user()
    820  1.37     lukem {
    821  1.37     lukem 	local op="$1"
    822  1.37     lukem 	local failed=0
    823  1.37     lukem 
    824  1.37     lukem 	local conf="${DEST_DIR}/etc/atf/common.conf"
    825  1.37     lukem 	if grep '[^#]*unprivileged-user[ \t]*=.*_atf' "${conf}" >/dev/null
    826  1.37     lukem 	then
    827  1.37     lukem 		if [ "$1" = "fix" ]; then
    828  1.37     lukem 			${SED} -e \
    829  1.37     lukem 			    "/[^#]*unprivileged-user[\ t]*=/s/_atf/_tests/" \
    830  1.37     lukem 			    "${conf}" >"${conf}.new"
    831  1.37     lukem 			failed=$(( ${failed} + $? ))
    832  1.37     lukem 			mv "${conf}.new" "${conf}"
    833  1.37     lukem 			failed=$(( ${failed} + $? ))
    834  1.37     lukem 			msg "Set unprivileged-user=_tests in ${conf}"
    835  1.37     lukem 		else
    836  1.37     lukem 			msg "unprivileged-user=_atf in ${conf} should be" \
    837  1.37     lukem 			    "unprivileged-user=_tests"
    838  1.37     lukem 			failed=1
    839  1.37     lukem 		fi
    840  1.37     lukem 	fi
    841  1.37     lukem 
    842  1.37     lukem 	return ${failed}
    843  1.37     lukem }
    844  1.37     lukem 
    845  1.37     lukem additem atf "install missing atf configuration files and validate them"
    846  1.37     lukem do_atf()
    847   1.1  christos {
    848  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_atf fix|check"
    849   1.1  christos 	op="$1"
    850   1.1  christos 	failed=0
    851   1.1  christos 
    852  1.37     lukem 	# Ensure atf configuration files are in place.
    853  1.37     lukem 	if find_file_in_dirlist NetBSD.conf "NetBSD.conf" \
    854  1.37     lukem 	    "${SRC_DIR}/external/bsd/atf/etc/atf" \
    855  1.37     lukem 	    "${SRC_DIR}/etc/atf"; then
    856  1.37     lukem 			# ${dir} is set by find_file_in_dirlist()
    857  1.37     lukem 		populate_dir "${op}" true "${dir}" "${DEST_DIR}/etc/atf" 644 \
    858  1.37     lukem 		    NetBSD.conf common.conf || failed=1
    859  1.37     lukem 	else
    860  1.37     lukem 		failed=1
    861  1.37     lukem 	fi
    862  1.37     lukem 	if find_file_in_dirlist atf-run.hooks "atf-run.hooks" \
    863  1.37     lukem 	    "${SRC_DIR}/external/bsd/atf/dist/tools/sample" \
    864  1.37     lukem 	    "${SRC_DIR}/etc/atf"; then
    865  1.37     lukem 			# ${dir} is set by find_file_in_dirlist()
    866  1.37     lukem 		populate_dir "${op}" true "${dir}" "${DEST_DIR}/etc/atf" 644 \
    867  1.37     lukem 		    atf-run.hooks || failed=1
    868  1.37     lukem 	else
    869  1.37     lukem 		failed=1
    870  1.37     lukem 	fi
    871  1.37     lukem 
    872  1.37     lukem 	# Validate the _atf to _tests user/group renaming.
    873  1.37     lukem 	if [ -f "${DEST_DIR}/etc/atf/common.conf" ]; then
    874  1.37     lukem 		handle_atf_user "${op}" || failed=1
    875  1.37     lukem 	else
    876  1.37     lukem 		failed=1
    877  1.37     lukem 	fi
    878  1.37     lukem 
    879  1.37     lukem 	return ${failed}
    880  1.37     lukem }
    881  1.37     lukem 
    882   1.1  christos 
    883  1.37     lukem #
    884  1.37     lukem #	autofsconfig
    885  1.37     lukem #
    886   1.1  christos 
    887  1.37     lukem additem autofsconfig "automounter configuration files"
    888  1.37     lukem do_autofsconfig()
    889  1.37     lukem {
    890  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_autofsconfig fix|check"
    891  1.37     lukem 	local autofs_files="
    892  1.37     lukem include_ldap
    893  1.37     lukem include_nis
    894  1.37     lukem special_hosts
    895  1.37     lukem special_media
    896  1.37     lukem special_noauto
    897  1.37     lukem special_null
    898  1.37     lukem "
    899  1.37     lukem 	op="$1"
    900  1.37     lukem 	failed=0
    901  1.37     lukem 	if [ "$op" = "fix" ]; then
    902  1.37     lukem 		mkdir -p "${DEST_DIR}/etc/autofs"
    903   1.1  christos 	fi
    904  1.37     lukem 	failed=$(( ${failed} + $? ))
    905  1.39   mlelstv 	populate_dir "$op" true "${SRC_DIR}/etc" \
    906  1.37     lukem 	    "${DEST_DIR}/etc" \
    907  1.37     lukem 	    644 \
    908  1.37     lukem 	    auto_master
    909  1.37     lukem 	failed=$(( ${failed} + $? ))
    910  1.39   mlelstv 	populate_dir "$op" true "${SRC_DIR}/etc/autofs" \
    911  1.37     lukem 	    "${DEST_DIR}/etc/autofs" \
    912  1.37     lukem 	    644 \
    913  1.37     lukem 	    ${autofs_files}
    914   1.1  christos 	return ${failed}
    915   1.1  christos }
    916   1.1  christos 
    917  1.37     lukem 
    918  1.37     lukem #
    919  1.37     lukem #	blocklist
    920  1.37     lukem #
    921  1.37     lukem 
    922  1.37     lukem fixblock()
    923  1.37     lukem {
    924  1.29       rin 	local op="$1"
    925  1.29       rin 	local target="${DEST_DIR}$2"
    926  1.29       rin 
    927  1.29       rin 	if [ ! -f "${target}" ]; then
    928  1.29       rin 		continue
    929  1.29       rin 	fi
    930  1.29       rin 
    931  1.29       rin 	if ${GREP} '[bB]lack' "${target}" > /dev/null; then
    932  1.29       rin 		if [ "$1" = "check" ]; then
    933  1.29       rin 			msg "Fix old configuration file(s)."
    934  1.29       rin 			return 1
    935  1.29       rin 		else
    936  1.29       rin 			local p=$(${STAT} -f %Lp "${target}")
    937  1.29       rin 			chmod u+w "${target}" || return 1
    938  1.32  christos 			if [ "$2" = "/etc/npf.conf" ]; then
    939  1.33  christos 				${SED} -i -e 's/"blacklistd"/"blocklistd"/g' "${target}"
    940  1.32  christos 			else
    941  1.32  christos 				${SED} -i -e 's/\([bB]\)lacklist/\1locklist/g' "${target}"
    942  1.32  christos 			fi
    943  1.29       rin 			chmod "${p}" "${target}"
    944  1.24  christos 		fi
    945  1.29       rin 	fi
    946  1.24  christos }
    947  1.24  christos 
    948  1.24  christos additem blocklist "rename old files to blocklist"
    949  1.24  christos do_blocklist()
    950  1.24  christos {
    951  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_blocklist fix|check"
    952  1.29       rin 	local op="$1"
    953  1.30  riastrad 
    954  1.24  christos 	# if we are actually using blocklistd
    955  1.29       rin 	for i in /var/db/blacklist.db /etc/blacklistd.conf; do
    956  1.29       rin 		local old="${DEST_DIR}${i}"
    957  1.29       rin 		if [ ! -f "${old}" ]; then
    958  1.29       rin 			continue
    959  1.29       rin 		elif [ "$1" = "check" ]; then
    960  1.29       rin 			msg "Rename old file(s)."
    961  1.29       rin 			return 1
    962  1.29       rin 		fi
    963  1.29       rin 		local new=$(echo "${old}" | ${SED} s/black/block/)
    964  1.29       rin 		mv "${old}" "${new}" || return 1
    965  1.29       rin 	done
    966  1.24  christos 
    967  1.29       rin 	for i in /etc/rc.conf /etc/npf.conf /etc/blocklistd.conf \
    968  1.29       rin 	    /etc/defaults/rc.conf; do
    969  1.29       rin 		fixblock "${op}" "${i}" || return 1
    970  1.29       rin 	done
    971  1.24  christos }
    972  1.24  christos 
    973  1.37     lukem 
    974  1.37     lukem #
    975  1.37     lukem #	bluetooth
    976  1.37     lukem #
    977  1.37     lukem 
    978  1.37     lukem additem bluetooth "Bluetooth configuration is up to date"
    979  1.37     lukem do_bluetooth()
    980  1.37     lukem {
    981  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_bluetooth fix|check"
    982  1.37     lukem 	op="$1"
    983  1.37     lukem 	failed=0
    984  1.37     lukem 
    985  1.37     lukem 	populate_dir "${op}" true \
    986  1.37     lukem 		"${SRC_DIR}/etc/bluetooth" "${DEST_DIR}/etc/bluetooth" 644 \
    987  1.37     lukem 		hosts protocols btattach.conf btdevctl.conf
    988  1.37     lukem 	failed=$(( ${failed} + $? ))
    989  1.37     lukem 
    990  1.37     lukem 	move_file "${op}" "${DEST_DIR}/var/db/btdev.xml" \
    991  1.37     lukem 			"${DEST_DIR}/var/db/btdevctl.plist"
    992  1.37     lukem 	failed=$(( ${failed} + $? ))
    993  1.37     lukem 
    994  1.37     lukem 	notfixed=""
    995  1.37     lukem 	if [ "${op}" = "fix" ]; then
    996  1.37     lukem 		notfixed="${NOT_FIXED}"
    997  1.37     lukem 	fi
    998  1.37     lukem 	for _v in btattach btconfig btdevctl; do
    999  1.37     lukem 		if rcvar_is_enabled "${_v}"; then
   1000  1.37     lukem 			msg \
   1001  1.37     lukem     "${_v} is obsolete in rc.conf(5)${notfixed}: use bluetooth=YES"
   1002  1.37     lukem 			failed=$(( ${failed} + 1 ))
   1003  1.37     lukem 		fi
   1004  1.37     lukem 	done
   1005  1.37     lukem 
   1006  1.37     lukem 	return ${failed}
   1007  1.37     lukem }
   1008  1.37     lukem 
   1009  1.37     lukem 
   1010  1.37     lukem #
   1011  1.37     lukem #	catpages
   1012  1.37     lukem #
   1013  1.37     lukem 
   1014  1.37     lukem obsolete_catpages()
   1015  1.37     lukem {
   1016  1.37     lukem 	basedir="$2"
   1017  1.37     lukem 	section="$3"
   1018  1.37     lukem 	mandir="${basedir}/man${section}"
   1019  1.37     lukem 	catdir="${basedir}/cat${section}"
   1020  1.37     lukem 	test -d "$mandir" || return 0
   1021  1.37     lukem 	test -d "$catdir" || return 0
   1022  1.37     lukem 	(cd "$mandir" && find . -type f) | {
   1023  1.37     lukem 	failed=0
   1024  1.37     lukem 	while read manpage; do
   1025  1.37     lukem 		manpage="${manpage#./}"
   1026  1.37     lukem 		case "$manpage" in
   1027  1.37     lukem 		*.Z)
   1028  1.37     lukem 			catname="$catdir/${manpage%.*.Z}.0"
   1029  1.37     lukem 			;;
   1030  1.37     lukem 		*.gz)
   1031  1.37     lukem 			catname="$catdir/${manpage%.*.gz}.0"
   1032  1.37     lukem 			;;
   1033  1.37     lukem 		*)
   1034  1.37     lukem 			catname="$catdir/${manpage%.*}.0"
   1035  1.37     lukem 			;;
   1036  1.37     lukem 		esac
   1037  1.37     lukem 		test -e "$catname" -a "$catname" -ot "$mandir/$manpage" || continue
   1038  1.37     lukem 		if [ "$1" = "fix" ]; then
   1039  1.37     lukem 			rm "$catname"
   1040  1.37     lukem 			failed=$(( ${failed} + $? ))
   1041  1.37     lukem 			msg "Removed obsolete cat page $catname"
   1042  1.37     lukem 		else
   1043  1.37     lukem 			msg "Obsolete cat page $catname"
   1044  1.37     lukem 			failed=1
   1045  1.37     lukem 		fi
   1046  1.37     lukem 	done
   1047  1.37     lukem 	exit $failed
   1048  1.37     lukem 	}
   1049  1.37     lukem }
   1050  1.37     lukem 
   1051  1.37     lukem additem catpages "remove outdated cat pages"
   1052  1.37     lukem do_catpages()
   1053  1.37     lukem {
   1054  1.37     lukem 	failed=0
   1055  1.37     lukem 	for manbase in /usr/share/man /usr/X11R6/man /usr/X11R7/man; do
   1056  1.37     lukem 		for sec in 1 2 3 4 5 6 7 8 9; do
   1057  1.37     lukem 			obsolete_catpages "$1" "${DEST_DIR}${manbase}" "${sec}"
   1058  1.37     lukem 			failed=$(( ${failed} + $? ))
   1059  1.37     lukem 			if [ "$1" = "fix" ]; then
   1060  1.37     lukem 				rmdir "${DEST_DIR}${manbase}/cat${sec}"/* \
   1061  1.37     lukem 					2>/dev/null
   1062  1.37     lukem 				rmdir "${DEST_DIR}${manbase}/cat${sec}" \
   1063  1.37     lukem 					2>/dev/null
   1064  1.37     lukem 			fi
   1065  1.37     lukem 		done
   1066  1.37     lukem 	done
   1067  1.37     lukem 	return $failed
   1068  1.37     lukem }
   1069  1.37     lukem 
   1070  1.37     lukem 
   1071   1.1  christos #
   1072   1.1  christos #	ddbonpanic
   1073   1.1  christos #
   1074  1.37     lukem 
   1075   1.1  christos additem ddbonpanic "verify ddb.onpanic is configured in sysctl.conf"
   1076   1.1  christos do_ddbonpanic()
   1077   1.1  christos {
   1078  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_ddbonpanic fix|check"
   1079   1.1  christos 
   1080   1.1  christos 	if ${GREP} -E '^#*[[:space:]]*ddb\.onpanic[[:space:]]*\??=[[:space:]]*[[:digit:]]+' \
   1081   1.1  christos 		"${DEST_DIR}/etc/sysctl.conf" >/dev/null 2>&1
   1082   1.1  christos 	then
   1083   1.1  christos 		result=0
   1084   1.1  christos 	else
   1085   1.1  christos 		if [ "$1" = check ]; then
   1086   1.1  christos 			msg \
   1087   1.1  christos     "The ddb.onpanic behaviour is not explicitly specified in /etc/sysctl.conf"
   1088   1.1  christos 			result=1
   1089   1.1  christos 		else
   1090   1.1  christos 			echo >> "${DEST_DIR}/etc/sysctl.conf"
   1091   1.1  christos 			${SED} < "${SRC_DIR}/etc/sysctl.conf" \
   1092   1.1  christos 			   -e '/^ddb\.onpanic/q' | \
   1093   1.1  christos 			       ${SED} -e '1,/^$/d' >> \
   1094   1.1  christos 			    "${DEST_DIR}/etc/sysctl.conf"
   1095   1.1  christos 			result=$?
   1096   1.1  christos 		fi
   1097   1.1  christos 	fi
   1098   1.1  christos 	return ${result}
   1099   1.1  christos }
   1100   1.1  christos 
   1101  1.37     lukem 
   1102   1.1  christos #
   1103   1.1  christos #	defaults
   1104   1.1  christos #
   1105  1.37     lukem 
   1106   1.1  christos additem defaults "/etc/defaults/ being up to date"
   1107   1.1  christos do_defaults()
   1108   1.1  christos {
   1109  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_defaults fix|check"
   1110   1.1  christos 	local op="$1"
   1111   1.1  christos 	local failed=0
   1112   1.1  christos 	local etcsets=$(getetcsets)
   1113   1.1  christos 
   1114   1.1  christos 	local rc_exclude_scripts=""
   1115   1.1  christos 	if $SOURCEMODE; then
   1116   1.1  christos 		# For most architectures rc.conf(5) should be the same as the
   1117   1.1  christos 		# one obtained from a source directory, except for the ones
   1118   1.1  christos 		# that have an append file for it.
   1119   1.1  christos 		local rc_conf_app="${SRC_DIR}/etc/etc.${MACHINE}/rc.conf.append"
   1120   1.1  christos 		if [ -f "${rc_conf_app}" ]; then
   1121   1.1  christos 			rc_exclude_scripts="rc.conf"
   1122   1.1  christos 
   1123   1.1  christos 			# Generate and compare the correct rc.conf(5) file
   1124   1.1  christos 			mkdir "${SCRATCHDIR}/defaults"
   1125   1.1  christos 
   1126   1.1  christos 			cat "${SRC_DIR}/etc/defaults/rc.conf" "${rc_conf_app}" \
   1127   1.1  christos 			    > "${SCRATCHDIR}/defaults/rc.conf"
   1128   1.1  christos 
   1129   1.1  christos 			compare_dir "${op}" "${SCRATCHDIR}/defaults" \
   1130   1.1  christos 			    "${DEST_DIR}/etc/defaults" \
   1131   1.1  christos 			    444 \
   1132   1.1  christos 			    "rc.conf"
   1133   1.1  christos 			failed=$(( ${failed} + $? ))
   1134   1.1  christos 		fi
   1135   1.1  christos 	fi
   1136   1.1  christos 
   1137   1.1  christos 	find_file_in_dirlist pf.boot.conf "pf.boot.conf" \
   1138   1.1  christos 	    "${SRC_DIR}/usr.sbin/pf/etc/defaults" "${SRC_DIR}/etc/defaults" \
   1139   1.1  christos 	    || return 1
   1140   1.1  christos 	# ${dir} is set by find_file_in_dirlist()
   1141   1.1  christos 	compare_dir "$op" "${dir}" "${DEST_DIR}/etc/defaults" 444 pf.boot.conf
   1142   1.1  christos 	failed=$(( ${failed} + $? ))
   1143   1.1  christos 
   1144   1.1  christos 	rc_exclude_scripts="${rc_exclude_scripts} pf.boot.conf"
   1145   1.1  christos 
   1146   1.1  christos 	local rc_default_conf_files="$(select_set_files /etc/defaults/ \
   1147   1.1  christos 	    "/etc/defaults/\([^[:space:]]*\.conf\)" ${etcsets} | \
   1148   1.1  christos 	    exclude ${rc_exclude_scripts})"
   1149   1.1  christos 	compare_dir "$op" "${SRC_DIR}/etc/defaults" "${DEST_DIR}/etc/defaults" \
   1150   1.1  christos 		444 \
   1151   1.1  christos 		${rc_default_conf_files}
   1152   1.1  christos 	failed=$(( ${failed} + $? ))
   1153   1.1  christos 
   1154   1.1  christos 
   1155   1.1  christos 	return ${failed}
   1156   1.1  christos }
   1157   1.1  christos 
   1158  1.37     lukem 
   1159   1.1  christos #
   1160   1.1  christos #	dhcpcd
   1161   1.1  christos #
   1162  1.37     lukem 
   1163   1.1  christos additem dhcpcd "dhcpcd configuration is up to date"
   1164   1.1  christos do_dhcpcd()
   1165   1.1  christos {
   1166   1.1  christos 	[ -n "$1" ] || err 3 "USAGE: do_dhcpcd fix|check"
   1167   1.1  christos 	op="$1"
   1168   1.1  christos 	failed=0
   1169   1.1  christos 
   1170   1.1  christos 	find_file_in_dirlist dhcpcd.conf "dhcpcd.conf" \
   1171   1.1  christos 	    "${SRC_DIR}/external/bsd/dhcpcd/dist/src" \
   1172   1.1  christos 	    "${SRC_DIR}/etc" || return 1
   1173   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   1174   1.1  christos 	populate_dir "$op" true "${dir}" "${DEST_DIR}/etc" 644 dhcpcd.conf
   1175   1.1  christos 	failed=$(( ${failed} + $? ))
   1176   1.1  christos 
   1177  1.22       roy 	check_dir "${op}" "${DEST_DIR}/var/db/dhcpcd" 755
   1178   1.1  christos 	failed=$(( ${failed} + $? ))
   1179   1.1  christos 
   1180   1.1  christos 	move_file "${op}" \
   1181   1.1  christos 		"${DEST_DIR}/etc/dhcpcd.duid" \
   1182  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/duid"
   1183   1.1  christos 	failed=$(( ${failed} + $? ))
   1184   1.1  christos 
   1185   1.1  christos 	move_file "${op}" \
   1186   1.1  christos 		"${DEST_DIR}/etc/dhcpcd.secret" \
   1187  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/secret"
   1188   1.1  christos 	failed=$(( ${failed} + $? ))
   1189   1.1  christos 
   1190   1.1  christos 	move_file "${op}" \
   1191   1.1  christos 		"${DEST_DIR}/var/db/dhcpcd-rdm.monotonic" \
   1192  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/rdm_monotonic"
   1193   1.1  christos 	failed=$(( ${failed} + $? ))
   1194   1.1  christos 
   1195   1.1  christos 	for lease in "${DEST_DIR}/var/db/dhcpcd-"*.lease*; do
   1196   1.1  christos 		[ -f "${lease}" ] || continue
   1197   1.1  christos 		new_lease=$(basename "${lease}" | ${SED} -e 's/dhcpcd-//')
   1198  1.22       roy 		new_lease="${DEST_DIR}/var/db/dhcpcd/${new_lease}"
   1199   1.1  christos 		move_file "${op}" "${lease}" "${new_lease}"
   1200   1.1  christos 		failed=$(( ${failed} + $? ))
   1201   1.1  christos 	done
   1202   1.1  christos 
   1203  1.22       roy 	chroot_dir="${DEST_DIR}/var/chroot/dhcpcd"
   1204  1.16       roy 	move_file "${op}" \
   1205  1.22       roy 		"${chroot_dir}/var/db/dhcpcd/duid" \
   1206  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/duid"
   1207  1.16       roy 	failed=$(( ${failed} + $? ))
   1208  1.16       roy 
   1209  1.16       roy 	move_file "${op}" \
   1210  1.22       roy 		"${chroot_dir}/var/db/dhcpcd/secret" \
   1211  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/secret"
   1212  1.16       roy 	failed=$(( ${failed} + $? ))
   1213  1.16       roy 
   1214  1.16       roy 	move_file "${op}" \
   1215  1.22       roy 		"${chroot_dir}/var/db/dhcpcd/rdm_monotonic" \
   1216  1.22       roy 		"${DEST_DIR}/var/db/dhcpcd/rdm_monotonic"
   1217  1.16       roy 	failed=$(( ${failed} + $? ))
   1218  1.16       roy 
   1219  1.22       roy 	for lease in "${chroot_dir}/var/db/dhcpcd/"*.lease*; do
   1220  1.16       roy 		[ -f "${lease}" ] || continue
   1221  1.22       roy 		new_lease="${DEST_DIR}/var/db/dhcpcd/$(basename ${lease})"
   1222  1.16       roy 		move_file "${op}" "${lease}" "${new_lease}"
   1223  1.16       roy 		failed=$(( ${failed} + $? ))
   1224  1.16       roy 	done
   1225  1.16       roy 
   1226  1.22       roy 	# Ensure chroot is now empty
   1227  1.22       roy 	for dir in \
   1228  1.23       roy 		$(find ${chroot_dir} ! -type d) \
   1229  1.22       roy 		$(find ${chroot_dir} -type d -mindepth 1 | sort -r)
   1230  1.22       roy 	do
   1231  1.22       roy 		echo "/var/chroot/dhcpcd${dir##${chroot_dir}}"
   1232  1.22       roy 	done | obsolete_paths "${op}"
   1233  1.22       roy 	failed=$(( ${failed} + $? ))
   1234  1.22       roy 
   1235  1.22       roy 	contents_owner "${op}" "${DEST_DIR}/var/db/dhcpcd" root wheel
   1236  1.16       roy 	failed=$(( ${failed} + $? ))
   1237  1.16       roy 
   1238   1.1  christos 	return ${failed}
   1239   1.1  christos }
   1240   1.1  christos 
   1241  1.37     lukem 
   1242   1.1  christos #
   1243   1.1  christos #	dhcpcdrundir
   1244   1.1  christos #
   1245  1.37     lukem 
   1246  1.41    andvar additem dhcpcdrundir "accidentally created /@RUNDIR@ does not exist"
   1247   1.1  christos do_dhcpcdrundir()
   1248   1.1  christos {
   1249   1.1  christos 	[ -n "$1" ] || err 3 "USAGE: do_dhcpcdrundir fix|check"
   1250   1.1  christos 	op="$1"
   1251   1.1  christos 	failed=0
   1252   1.1  christos 
   1253   1.1  christos 	if [ -d "${DEST_DIR}/@RUNDIR@" ]; then
   1254   1.1  christos 		if [ "${op}" = "check" ]; then
   1255  1.40    andvar 			msg "Remove erroneously created /@RUNDIR@"
   1256   1.1  christos 			failed=1
   1257   1.1  christos 		elif ! rm -r "${DEST_DIR}/@RUNDIR@"; then
   1258   1.1  christos 			msg "Failed to remove ${DEST_DIR}/@RUNDIR@"
   1259   1.1  christos 			failed=1
   1260   1.1  christos 		else
   1261  1.40    andvar 			msg "Removed erroneously created ${DEST_DIR}/@RUNDIR@"
   1262   1.1  christos 		fi
   1263   1.1  christos 	fi
   1264   1.1  christos 	return ${failed}
   1265   1.1  christos }
   1266   1.1  christos 
   1267  1.37     lukem 
   1268   1.1  christos #
   1269   1.1  christos #	envsys
   1270   1.1  christos #
   1271  1.37     lukem 
   1272   1.1  christos additem envsys "envsys configuration is up to date"
   1273   1.1  christos do_envsys()
   1274   1.1  christos {
   1275   1.1  christos 	[ -n "$1" ] || err 3 "USAGE: do_envsys fix|check"
   1276   1.3  christos 	local op="$1"
   1277   1.3  christos 	local failed=0
   1278   1.3  christos 	local etcsets=$(getetcsets)
   1279   1.1  christos 
   1280   1.1  christos 	populate_dir "$op" true "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   1281   1.1  christos 		envsys.conf
   1282   1.1  christos 	failed=$(( ${failed} + $? ))
   1283   1.1  christos 
   1284   1.3  christos 	local powerd_scripts="$(select_set_files /etc/powerd/scripts/ \
   1285   1.3  christos 	    "/etc/powerd/scripts/\([^[:space:]/]*\)" ${etcsets})"
   1286   1.3  christos 
   1287   1.1  christos 	populate_dir "$op" true "${SRC_DIR}/etc/powerd/scripts" \
   1288   1.3  christos 		"${DEST_DIR}/etc/powerd/scripts" \
   1289   1.3  christos 		555 \
   1290   1.3  christos 		${powerd_scripts}
   1291   1.1  christos 	failed=$(( ${failed} + $? ))
   1292   1.1  christos 
   1293   1.1  christos 	return ${failed}
   1294   1.1  christos }
   1295   1.1  christos 
   1296  1.37     lukem 
   1297   1.1  christos #
   1298  1.37     lukem #	fontconfig
   1299  1.13  christos #
   1300  1.37     lukem 
   1301  1.37     lukem additem fontconfig "X11 font configuration is up to date"
   1302  1.37     lukem do_fontconfig()
   1303  1.13  christos {
   1304  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_fontconfig fix|check"
   1305  1.13  christos 	op="$1"
   1306  1.13  christos 	failed=0
   1307  1.37     lukem 
   1308  1.37     lukem 	# First, check for updates we can handle.
   1309  1.37     lukem 	if ! $SOURCEMODE; then
   1310  1.37     lukem 		FONTCONFIG_DIR="${SRC_DIR}/etc/fonts/conf.avail"
   1311  1.37     lukem 	else
   1312  1.37     lukem 		FONTCONFIG_DIR="${XSRC_DIR}/external/mit/fontconfig/dist/conf.d"
   1313  1.37     lukem 	fi
   1314  1.37     lukem 
   1315  1.37     lukem 	if [ ! -d "${FONTCONFIG_DIR}" ]; then
   1316  1.37     lukem 		msg "${FONTCONFIG_DIR} is not a directory; skipping check"
   1317  1.37     lukem 		return 0
   1318  1.13  christos 	fi
   1319  1.37     lukem 	local regular_fonts="
   1320  1.37     lukem 10-autohint.conf
   1321  1.37     lukem 10-no-sub-pixel.conf
   1322   1.4  christos 10-scale-bitmap-fonts.conf
   1323   1.4  christos 10-sub-pixel-bgr.conf
   1324   1.4  christos 10-sub-pixel-rgb.conf
   1325   1.4  christos 10-sub-pixel-vbgr.conf
   1326   1.4  christos 10-sub-pixel-vrgb.conf
   1327   1.4  christos 10-unhinted.conf
   1328   1.4  christos 11-lcdfilter-default.conf
   1329   1.4  christos 11-lcdfilter-legacy.conf
   1330   1.4  christos 11-lcdfilter-light.conf
   1331   1.4  christos 20-unhint-small-vera.conf
   1332   1.4  christos 25-unhint-nonlatin.conf
   1333   1.4  christos 30-metric-aliases.conf
   1334   1.4  christos 40-nonlatin.conf
   1335   1.4  christos 45-generic.conf
   1336   1.4  christos 45-latin.conf
   1337   1.4  christos 49-sansserif.conf
   1338   1.4  christos 50-user.conf
   1339   1.4  christos 51-local.conf
   1340   1.4  christos 60-generic.conf
   1341   1.4  christos 60-latin.conf
   1342   1.4  christos 65-fonts-persian.conf
   1343   1.4  christos 65-khmer.conf
   1344   1.4  christos 65-nonlatin.conf
   1345   1.4  christos 69-unifont.conf
   1346   1.4  christos 70-no-bitmaps.conf
   1347   1.4  christos 70-yes-bitmaps.conf
   1348   1.4  christos 80-delicious.conf
   1349   1.4  christos 90-synthetic.conf
   1350   1.4  christos "
   1351   1.4  christos 	populate_dir "$op" false "${FONTCONFIG_DIR}" \
   1352   1.4  christos 	    "${DEST_DIR}/etc/fonts/conf.avail" \
   1353   1.4  christos 	    444 \
   1354   1.4  christos 	    ${regular_fonts}
   1355   1.1  christos 	failed=$(( ${failed} + $? ))
   1356   1.1  christos 
   1357   1.1  christos 	if ! $SOURCEMODE; then
   1358   1.1  christos 		FONTS_DIR="${SRC_DIR}/etc/fonts"
   1359   1.1  christos 	else
   1360   1.1  christos 		FONTS_DIR="${SRC_DIR}/external/mit/xorg/lib/fontconfig/etc"
   1361   1.1  christos 	fi
   1362   1.1  christos 
   1363   1.1  christos 	populate_dir "$op" false "${FONTS_DIR}" "${DEST_DIR}/etc/fonts" 444 \
   1364   1.1  christos 		fonts.conf
   1365   1.1  christos 	failed=$(( ${failed} + $? ))
   1366   1.1  christos 
   1367   1.1  christos 	# We can't modify conf.d easily; someone might have removed a file.
   1368   1.1  christos 
   1369   1.1  christos 	# Look for old files that need to be deleted.
   1370   1.4  christos 	obsolete_fonts="
   1371   1.4  christos 10-autohint.conf
   1372   1.4  christos 10-no-sub-pixel.conf
   1373   1.4  christos 10-sub-pixel-bgr.conf
   1374   1.4  christos 10-sub-pixel-rgb.conf
   1375   1.4  christos 10-sub-pixel-vbgr.conf
   1376   1.4  christos 10-sub-pixel-vrgb.conf
   1377   1.4  christos 10-unhinted.conf
   1378   1.4  christos 25-unhint-nonlatin.conf
   1379   1.4  christos 65-khmer.conf
   1380   1.4  christos 70-no-bitmaps.conf
   1381   1.4  christos 70-yes-bitmaps.conf
   1382   1.4  christos "
   1383   1.4  christos 	failed_fonts=""
   1384   1.4  christos 	for i in ${obsolete_fonts}; do
   1385   1.4  christos 	    if [ -f "${DEST_DIR}/etc/fonts/conf.d/$i" ]; then
   1386   1.4  christos 		    conf_d_failed=1
   1387   1.4  christos 		    failed_fonts="$failed_fonts $i"
   1388   1.4  christos 	    fi
   1389   1.4  christos 	done
   1390   1.1  christos 
   1391   1.4  christos 	if [ -n "$failed_fonts" ]; then
   1392   1.1  christos 		msg \
   1393   1.4  christos     "Broken fontconfig configuration found; please delete these files:"
   1394   1.4  christos 		msg "[$failed_fonts]"
   1395   1.4  christos 		failed=$(( ${failed} + 1 ))
   1396   1.1  christos 	fi
   1397   1.1  christos 
   1398   1.1  christos 	return ${failed}
   1399   1.1  christos }
   1400   1.1  christos 
   1401  1.37     lukem 
   1402   1.1  christos #
   1403   1.1  christos #	gid
   1404   1.1  christos #
   1405  1.37     lukem 
   1406   1.1  christos additem gid "required groups in /etc/group"
   1407   1.1  christos do_gid()
   1408   1.1  christos {
   1409  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_gid fix|check"
   1410   1.1  christos 
   1411   1.1  christos 	check_ids "$1" groups "${DEST_DIR}/etc/group" \
   1412   1.1  christos 	    "${SRC_DIR}/etc/group" 14 \
   1413   1.1  christos 	    named ntpd sshd SKIP _pflogd _rwhod staff _proxy _timedc \
   1414   1.1  christos 	    _sdpd _httpd _mdnsd _tests _tcpdump _tss _gpio _rtadvd SKIP \
   1415  1.17       roy 	    _unbound _nsd nvmm _dhcpcd
   1416   1.1  christos }
   1417   1.1  christos 
   1418  1.37     lukem 
   1419   1.1  christos #
   1420   1.1  christos #	gpio
   1421   1.1  christos #
   1422  1.37     lukem 
   1423   1.1  christos additem gpio "gpio configuration is up to date"
   1424   1.1  christos do_gpio()
   1425   1.1  christos {
   1426   1.1  christos 	[ -n "$1" ] || err 3 "USAGE: do_gpio fix|check"
   1427   1.1  christos 	op="$1"
   1428   1.1  christos 	failed=0
   1429   1.1  christos 
   1430   1.1  christos 	populate_dir "$op" true "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   1431   1.1  christos 		gpio.conf
   1432   1.1  christos 	failed=$(( ${failed} + $? ))
   1433   1.1  christos 
   1434   1.1  christos 	return ${failed}
   1435   1.1  christos }
   1436   1.1  christos 
   1437  1.37     lukem 
   1438   1.1  christos #
   1439   1.1  christos #	hosts
   1440   1.1  christos #
   1441  1.37     lukem 
   1442   1.1  christos additem hosts "/etc/hosts being up to date"
   1443   1.1  christos do_hosts()
   1444   1.1  christos {
   1445  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_hosts fix|check"
   1446   1.1  christos 
   1447   1.1  christos 	modify_file "$1" "${DEST_DIR}/etc/hosts" "${SCRATCHDIR}/hosts" '
   1448   1.1  christos 		/^(127\.0\.0\.1|::1)[ 	]+[^\.]*$/ {
   1449   1.1  christos 			print $0, "localhost."
   1450   1.1  christos 			next
   1451   1.1  christos 		}
   1452   1.1  christos 		{ print }
   1453   1.1  christos 	'
   1454   1.1  christos 	return $?
   1455   1.1  christos }
   1456   1.1  christos 
   1457  1.37     lukem 
   1458   1.1  christos #
   1459   1.1  christos #	iscsi
   1460   1.1  christos #
   1461  1.37     lukem 
   1462   1.1  christos additem iscsi "/etc/iscsi is populated"
   1463   1.1  christos do_iscsi()
   1464   1.1  christos {
   1465  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_iscsi fix|check"
   1466   1.1  christos 
   1467   1.1  christos 	populate_dir "${op}" true \
   1468   1.1  christos 	    "${SRC_DIR}/etc/iscsi" "${DEST_DIR}/etc/iscsi" 600 auths
   1469   1.1  christos 	populate_dir "${op}" true \
   1470   1.1  christos 	    "${SRC_DIR}/etc/iscsi" "${DEST_DIR}/etc/iscsi" 644 targets
   1471   1.1  christos 	return $?
   1472   1.1  christos }
   1473   1.1  christos 
   1474  1.37     lukem 
   1475  1.37     lukem #
   1476  1.37     lukem #	mailerconf
   1477  1.37     lukem #
   1478  1.37     lukem 
   1479  1.37     lukem adddisableditem mailerconf "update /etc/mailer.conf after sendmail removal"
   1480  1.37     lukem do_mailerconf()
   1481  1.37     lukem {
   1482  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_mailterconf fix|check"
   1483  1.37     lukem 	op="$1"
   1484  1.37     lukem 
   1485  1.37     lukem 	failed=0
   1486  1.37     lukem 	mta_path="$(${AWK} '/^sendmail[ \t]/{print$2}' \
   1487  1.37     lukem 		"${DEST_DIR}/etc/mailer.conf")"
   1488  1.37     lukem 	old_sendmail_path="/usr/libexec/sendmail/sendmail"
   1489  1.37     lukem 	if [ "${mta_path}" = "${old_sendmail_path}" ]; then
   1490  1.37     lukem 	    if [ "$op" = check ]; then
   1491  1.37     lukem 		msg "mailer.conf points to obsolete ${old_sendmail_path}"
   1492  1.37     lukem 		failed=1;
   1493  1.37     lukem 	    else
   1494  1.37     lukem 		populate_dir "${op}" false \
   1495  1.37     lukem 		"${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 mailer.conf
   1496  1.37     lukem 		failed=$?
   1497  1.37     lukem 	    fi
   1498  1.37     lukem 	fi
   1499  1.37     lukem 
   1500  1.37     lukem 	return ${failed}
   1501  1.37     lukem }
   1502  1.37     lukem 
   1503  1.37     lukem 
   1504   1.1  christos #
   1505   1.1  christos #	makedev
   1506   1.1  christos #
   1507  1.37     lukem 
   1508   1.1  christos additem makedev "/dev/MAKEDEV being up to date"
   1509   1.1  christos do_makedev()
   1510   1.1  christos {
   1511  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_makedev fix|check"
   1512   1.1  christos 	failed=0
   1513   1.1  christos 
   1514   1.1  christos 	if [ -f "${SRC_DIR}/etc/MAKEDEV.tmpl" ]; then
   1515   1.1  christos 			# generate MAKEDEV from source if source is available
   1516   1.1  christos 		env MACHINE="${MACHINE}" \
   1517   1.1  christos 		    MACHINE_ARCH="${MACHINE_ARCH}" \
   1518   1.1  christos 		    NETBSDSRCDIR="${SRC_DIR}" \
   1519   1.1  christos 		    ${AWK} -f "${SRC_DIR}/etc/MAKEDEV.awk" \
   1520   1.1  christos 		    "${SRC_DIR}/etc/MAKEDEV.tmpl" > "${SCRATCHDIR}/MAKEDEV"
   1521   1.1  christos 	fi
   1522   1.1  christos 
   1523   1.1  christos 	find_file_in_dirlist MAKEDEV "MAKEDEV" \
   1524   1.1  christos 	    "${SCRATCHDIR}" "${SRC_DIR}/dev" \
   1525   1.1  christos 	    || return 1
   1526   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   1527   1.1  christos 	find_makedev
   1528   1.1  christos 	compare_dir "$1" "${dir}" "${MAKEDEV_DIR}" 555 MAKEDEV
   1529   1.1  christos 	failed=$(( ${failed} + $? ))
   1530   1.1  christos 
   1531   1.1  christos 	find_file_in_dirlist MAKEDEV.local "MAKEDEV.local" \
   1532   1.1  christos 	    "${SRC_DIR}/etc" "${SRC_DIR}/dev" \
   1533   1.1  christos 	    || return 1
   1534   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   1535   1.1  christos 	compare_dir "$1" "${dir}" "${DEST_DIR}/dev" 555 MAKEDEV.local
   1536   1.1  christos 	failed=$(( ${failed} + $? ))
   1537   1.1  christos 
   1538   1.1  christos 	return ${failed}
   1539   1.1  christos }
   1540   1.1  christos 
   1541  1.37     lukem 
   1542  1.37     lukem #
   1543  1.37     lukem #	man.conf
   1544  1.37     lukem #
   1545  1.37     lukem 
   1546  1.37     lukem additem manconf "check for a mandoc usage in /etc/man.conf"
   1547  1.37     lukem do_manconf()
   1548  1.37     lukem {
   1549  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_manconf fix|check"
   1550  1.37     lukem 	op="$1"
   1551  1.37     lukem 	failed=0
   1552  1.37     lukem 
   1553  1.37     lukem 	[ -f "${DEST_DIR}/etc/man.conf" ] || return 0
   1554  1.37     lukem 	if ${GREP} -w "mandoc" "${DEST_DIR}/etc/man.conf" >/dev/null 2>&1;
   1555  1.37     lukem 	then
   1556  1.37     lukem 		failed=0;
   1557  1.37     lukem 	else
   1558  1.37     lukem 		failed=1
   1559  1.37     lukem 		notfixed=""
   1560  1.37     lukem 		if [ "${op}" = "fix" ]; then
   1561  1.37     lukem 			notfixed="${NOT_FIXED}"
   1562  1.37     lukem 		fi
   1563  1.37     lukem 		msg "The file /etc/man.conf has not been adapted to mandoc usage; you"
   1564  1.37     lukem 		msg "probably want to copy a new version over. ${notfixed}"
   1565  1.37     lukem 	fi
   1566  1.37     lukem 
   1567  1.37     lukem 	return ${failed}
   1568  1.37     lukem }
   1569  1.37     lukem 
   1570  1.37     lukem 
   1571   1.1  christos #
   1572   1.1  christos #	motd
   1573   1.1  christos #
   1574  1.37     lukem 
   1575   1.1  christos additem motd "contents of motd"
   1576   1.1  christos do_motd()
   1577   1.1  christos {
   1578  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_motd fix|check"
   1579   1.1  christos 
   1580   1.1  christos 	if ${GREP} -i 'http://www.NetBSD.org/Misc/send-pr.html' \
   1581   1.1  christos 		"${DEST_DIR}/etc/motd" >/dev/null 2>&1 \
   1582  1.15  nakayama 	    || ${GREP} -i 'https*://www.NetBSD.org/support/send-pr.html' \
   1583   1.1  christos 		"${DEST_DIR}/etc/motd" >/dev/null 2>&1
   1584   1.1  christos 	then
   1585   1.1  christos 		tmp1="$(mktemp /tmp/postinstall.motd.XXXXXXXX)"
   1586   1.1  christos 		tmp2="$(mktemp /tmp/postinstall.motd.XXXXXXXX)"
   1587   1.1  christos 		${SED} '1,2d' <"${SRC_DIR}/etc/motd" >"${tmp1}"
   1588   1.1  christos 		${SED} '1,2d' <"${DEST_DIR}/etc/motd" >"${tmp2}"
   1589   1.1  christos 
   1590   1.1  christos 		if [ "$1" = check ]; then
   1591   1.1  christos 			cmp -s "${tmp1}" "${tmp2}"
   1592   1.1  christos 			result=$?
   1593   1.1  christos 			if [ "${result}" -ne 0 ]; then
   1594   1.1  christos 				msg \
   1595   1.1  christos     "Bug reporting messages do not seem to match the installed release"
   1596   1.1  christos 			fi
   1597   1.1  christos 		else
   1598   1.1  christos 			head -n 2 "${DEST_DIR}/etc/motd" >"${tmp1}"
   1599   1.1  christos 			${SED} '1,2d' <"${SRC_DIR}/etc/motd" >>"${tmp1}"
   1600   1.1  christos 			cp "${tmp1}" "${DEST_DIR}/etc/motd"
   1601   1.1  christos 			result=0
   1602   1.1  christos 		fi
   1603   1.1  christos 
   1604   1.1  christos 		rm -f "${tmp1}" "${tmp2}"
   1605   1.1  christos 	else
   1606   1.1  christos 		result=0
   1607   1.1  christos 	fi
   1608   1.1  christos 
   1609   1.1  christos 	return ${result}
   1610   1.1  christos }
   1611   1.1  christos 
   1612  1.37     lukem 
   1613   1.1  christos #
   1614   1.1  christos #	mtree
   1615   1.1  christos #
   1616  1.37     lukem 
   1617   1.1  christos additem mtree "/etc/mtree/ being up to date"
   1618   1.1  christos do_mtree()
   1619   1.1  christos {
   1620  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_mtree fix|check"
   1621   1.1  christos 	failed=0
   1622   1.1  christos 
   1623   1.1  christos 	compare_dir "$1" "${SRC_DIR}/etc/mtree" "${DEST_DIR}/etc/mtree" 444 special
   1624   1.1  christos 	failed=$(( ${failed} + $? ))
   1625   1.1  christos 
   1626   1.1  christos 	if ! $SOURCEMODE; then
   1627   1.1  christos 		MTREE_DIR="${SRC_DIR}/etc/mtree"
   1628   1.1  christos 	else
   1629   1.1  christos 		/bin/rm -rf "${SCRATCHDIR}/obj"
   1630   1.1  christos 		mkdir "${SCRATCHDIR}/obj"
   1631   1.1  christos 		${MAKE} -s -C "${SRC_DIR}/etc/mtree" TOOL_AWK="${AWK}" \
   1632   1.1  christos 		    MAKEOBJDIR="${SCRATCHDIR}/obj" emit_dist_file > \
   1633   1.1  christos 		    "${SCRATCHDIR}/NetBSD.dist"
   1634   1.1  christos 		MTREE_DIR="${SCRATCHDIR}"
   1635   1.1  christos 		/bin/rm -rf "${SCRATCHDIR}/obj"
   1636   1.1  christos 	fi
   1637   1.1  christos 	compare_dir "$1" "${MTREE_DIR}" "${DEST_DIR}/etc/mtree" 444 NetBSD.dist
   1638   1.1  christos 	failed=$(( ${failed} + $? ))
   1639   1.1  christos 
   1640   1.1  christos 	return ${failed}
   1641   1.1  christos }
   1642   1.1  christos 
   1643  1.37     lukem 
   1644   1.1  christos #
   1645   1.1  christos #	named
   1646   1.1  christos #
   1647  1.37     lukem 
   1648   1.1  christos additem named "named configuration update"
   1649   1.1  christos do_named()
   1650   1.1  christos {
   1651  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_named fix|check"
   1652   1.1  christos 	op="$1"
   1653   1.1  christos 
   1654   1.1  christos 	move_file "${op}" \
   1655   1.1  christos 		"${DEST_DIR}/etc/namedb/named.conf" \
   1656   1.1  christos 		"${DEST_DIR}/etc/named.conf"
   1657   1.1  christos 
   1658   1.1  christos 	compare_dir "${op}" "${SRC_DIR}/etc/namedb" "${DEST_DIR}/etc/namedb" \
   1659   1.1  christos 		644 \
   1660   1.1  christos 		root.cache
   1661   1.1  christos }
   1662   1.1  christos 
   1663  1.37     lukem 
   1664   1.1  christos #
   1665   1.1  christos #	pam
   1666   1.1  christos #
   1667  1.37     lukem 
   1668   1.1  christos additem pam "/etc/pam.d is populated"
   1669   1.1  christos do_pam()
   1670   1.1  christos {
   1671  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pam fix|check"
   1672   1.1  christos 	op="$1"
   1673   1.1  christos 	failed=0
   1674   1.1  christos 
   1675   1.1  christos 	populate_dir "${op}" true "${SRC_DIR}/etc/pam.d" \
   1676   1.1  christos 		"${DEST_DIR}/etc/pam.d" 644 \
   1677   1.1  christos 		README cron display_manager ftpd gdm imap kde login other \
   1678   1.1  christos 		passwd pop3 ppp racoon rexecd rsh sshd su system telnetd \
   1679   1.1  christos 		xdm xserver
   1680   1.1  christos 
   1681   1.1  christos 	failed=$(( ${failed} + $? ))
   1682   1.1  christos 
   1683   1.1  christos 	return ${failed}
   1684   1.1  christos }
   1685   1.1  christos 
   1686  1.37     lukem 
   1687   1.1  christos #
   1688   1.1  christos #	periodic
   1689   1.1  christos #
   1690  1.37     lukem 
   1691   1.1  christos additem periodic "/etc/{daily,weekly,monthly,security} being up to date"
   1692   1.1  christos do_periodic()
   1693   1.1  christos {
   1694  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_periodic fix|check"
   1695   1.1  christos 
   1696   1.1  christos 	compare_dir "$1" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   1697   1.1  christos 		daily weekly monthly security
   1698   1.1  christos }
   1699   1.1  christos 
   1700  1.37     lukem 
   1701   1.1  christos #
   1702   1.1  christos #	pf
   1703   1.1  christos #
   1704  1.37     lukem 
   1705   1.1  christos additem pf "pf configuration being up to date"
   1706   1.1  christos do_pf()
   1707   1.1  christos {
   1708  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pf fix|check"
   1709   1.1  christos 	op="$1"
   1710   1.1  christos 	failed=0
   1711   1.1  christos 
   1712   1.1  christos 	find_file_in_dirlist pf.os "pf.os" \
   1713   1.1  christos 	    "${SRC_DIR}/dist/pf/etc" "${SRC_DIR}/etc" \
   1714   1.1  christos 	    || return 1
   1715   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   1716   1.1  christos 	populate_dir "${op}" true \
   1717   1.1  christos 	    "${dir}" "${DEST_DIR}/etc" 644 \
   1718   1.1  christos 	    pf.conf
   1719   1.1  christos 	failed=$(( ${failed} + $? ))
   1720   1.1  christos 
   1721   1.1  christos 	compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 pf.os
   1722   1.1  christos 	failed=$(( ${failed} + $? ))
   1723   1.1  christos 
   1724   1.1  christos 	return ${failed}
   1725   1.1  christos }
   1726   1.1  christos 
   1727  1.37     lukem 
   1728  1.37     lukem #
   1729  1.37     lukem #	ptyfsoldnodes
   1730  1.37     lukem #
   1731  1.37     lukem 
   1732  1.37     lukem additem ptyfsoldnodes "remove legacy device nodes when using ptyfs"
   1733  1.37     lukem do_ptyfsoldnodes()
   1734  1.37     lukem {
   1735  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_ptyfsoldnodes fix|check"
   1736  1.37     lukem 	_ptyfs_op="$1"
   1737  1.37     lukem 
   1738  1.37     lukem 	# Check whether ptyfs is in use
   1739  1.37     lukem 	failed=0;
   1740  1.37     lukem 	if ! ${GREP} -E "^ptyfs" "${DEST_DIR}/etc/fstab" > /dev/null; then
   1741  1.37     lukem 		msg "ptyfs is not in use"
   1742  1.37     lukem 		return 0
   1743  1.37     lukem 	fi
   1744  1.37     lukem 
   1745  1.37     lukem 	if [ ! -e "${DEST_DIR}/dev/pts" ]; then
   1746  1.37     lukem 		msg "ptyfs is not properly configured: missing /dev/pts"
   1747  1.37     lukem 		return 1
   1748  1.37     lukem 	fi
   1749  1.37     lukem 
   1750  1.37     lukem 	# Find the device major numbers for the pty master and slave
   1751  1.37     lukem 	# devices, by parsing the output from "MAKEDEV -s pty0".
   1752  1.37     lukem 	#
   1753  1.37     lukem 	# Output from MAKEDEV looks like this:
   1754  1.37     lukem 	# ./ttyp0 type=char device=netbsd,5,0 mode=666 gid=0 uid=0
   1755  1.37     lukem 	# ./ptyp0 type=char device=netbsd,6,0 mode=666 gid=0 uid=0
   1756  1.37     lukem 	#
   1757  1.37     lukem 	# Output from awk, used in the eval statement, looks like this:
   1758  1.37     lukem 	# maj_ptym=6; maj_ptys=5;
   1759  1.37     lukem 	#
   1760  1.37     lukem 	find_makedev
   1761  1.37     lukem 	eval "$(
   1762  1.37     lukem 	    ${HOST_SH} "${MAKEDEV_DIR}/MAKEDEV" -s pty0 2>/dev/null \
   1763  1.37     lukem 	    | ${AWK} '\
   1764  1.37     lukem 	    BEGIN { before_re = ".*device=[a-zA-Z]*,"; after_re = ",.*"; }
   1765  1.37     lukem 	    /ptyp0/ { maj_ptym = gensub(before_re, "", 1, $0);
   1766  1.37     lukem 		      maj_ptym = gensub(after_re, "", 1, maj_ptym); }
   1767  1.37     lukem 	    /ttyp0/ { maj_ptys = gensub(before_re, "", 1, $0);
   1768  1.37     lukem 		      maj_ptys = gensub(after_re, "", 1, maj_ptys); }
   1769  1.37     lukem 	    END { print "maj_ptym=" maj_ptym "; maj_ptys=" maj_ptys ";"; }
   1770  1.37     lukem 	    '
   1771  1.37     lukem 	    )"
   1772  1.37     lukem 	#msg "Major numbers are maj_ptym=${maj_ptym} maj_ptys=${maj_ptys}"
   1773  1.37     lukem 	if [ -z "$maj_ptym" ] || [ -z "$maj_ptys" ]; then
   1774  1.37     lukem 		msg "Cannot find device major numbers for pty master and slave"
   1775  1.37     lukem 		return 1
   1776  1.37     lukem 	fi
   1777  1.37     lukem 
   1778  1.37     lukem 	# look for /dev/[pt]ty[p-zP-T][0-9a-zA-Z], and check that they
   1779  1.37     lukem 	# have the expected device major numbers.  ttyv* is typically not a
   1780  1.37     lukem 	# pty device, but we check it anyway.
   1781  1.37     lukem 	#
   1782  1.37     lukem 	# The "for d1" loop is intended to avoid overflowing ARG_MAX;
   1783  1.37     lukem 	# otherwise we could have used a single glob pattern.
   1784  1.37     lukem 	#
   1785  1.37     lukem 	# If there are no files that match a particular pattern,
   1786  1.37     lukem 	# then stat prints something like:
   1787  1.37     lukem 	#    stat: /dev/[pt]tyx?: lstat: No such file or directory
   1788  1.37     lukem 	# and we ignore it.  XXX: We also ignore other error messages.
   1789  1.37     lukem 	#
   1790  1.37     lukem 	_ptyfs_tmp="$(mktemp /tmp/postinstall.ptyfs.XXXXXXXX)"
   1791  1.37     lukem 	for d1 in p q r s t u v w x y z P Q R S T; do
   1792  1.37     lukem 		${STAT} -f "%Hr %N" "${DEST_DIR}/dev/"[pt]ty${d1}? 2>&1
   1793  1.37     lukem 	done \
   1794  1.37     lukem 	| while read -r major node ; do
   1795  1.37     lukem 		case "$major" in
   1796  1.37     lukem 		${maj_ptym}|${maj_ptys}) echo "$node" ;;
   1797  1.37     lukem 		esac
   1798  1.37     lukem 	done >"${_ptyfs_tmp}"
   1799  1.37     lukem 
   1800  1.37     lukem 	_desc="legacy device node"
   1801  1.37     lukem 	while read node; do
   1802  1.37     lukem 		if [ "${_ptyfs_op}" = "check" ]; then
   1803  1.37     lukem 			msg "Remove ${_desc} ${node}"
   1804  1.37     lukem 			failed=1
   1805  1.37     lukem 		else # "fix"
   1806  1.37     lukem 			if rm "${node}"; then
   1807  1.37     lukem 				msg "Removed ${_desc} ${node}"
   1808  1.37     lukem 			else
   1809  1.37     lukem 				warn "Failed to remove ${_desc} ${node}"
   1810  1.37     lukem 				failed=1
   1811  1.37     lukem 			fi
   1812  1.37     lukem 		fi
   1813  1.37     lukem 	done < "${_ptyfs_tmp}"
   1814  1.37     lukem 	rm "${_ptyfs_tmp}"
   1815  1.37     lukem 
   1816  1.37     lukem 	return ${failed}
   1817  1.37     lukem }
   1818  1.37     lukem 
   1819  1.37     lukem 
   1820   1.1  christos #
   1821   1.1  christos #	pwd_mkdb
   1822   1.1  christos #
   1823  1.37     lukem 
   1824   1.1  christos additem pwd_mkdb "passwd database version"
   1825   1.1  christos do_pwd_mkdb()
   1826   1.1  christos {
   1827  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_pwd_mkdb fix|check"
   1828   1.1  christos 	op="$1"
   1829   1.1  christos 	failed=0
   1830   1.1  christos 
   1831   1.1  christos 	# XXX Ideally, we should figure out the endianness of the
   1832   1.1  christos 	# target machine, and add "-E B"/"-E L" to the db(1) flags,
   1833   1.1  christos 	# and "-B"/"-L" to the pwd_mkdb(8) flags if the target is not
   1834   1.1  christos 	# the same as the host machine.  It probably doesn't matter,
   1835   1.1  christos 	# because we don't expect "postinstall fix pwd_mkdb" to be
   1836   1.1  christos 	# invoked during a cross build.
   1837   1.1  christos 
   1838   1.1  christos 	set -- $(${DB} -q -Sb -Ub -To -N hash "${DEST_DIR}/etc/pwd.db" \
   1839   1.1  christos 		'VERSION\0')
   1840   1.1  christos 	case "$2" in
   1841   1.1  christos 	'\001\000\000\000') return 0 ;; # version 1, little-endian
   1842   1.1  christos 	'\000\000\000\001') return 0 ;; # version 1, big-endian
   1843   1.1  christos 	esac
   1844   1.1  christos 
   1845   1.1  christos 	if [ "${op}" = "check" ]; then
   1846   1.1  christos 		msg "Update format of passwd database"
   1847   1.1  christos 		failed=1
   1848   1.1  christos 	elif ! ${PWD_MKDB} -V 1 -d "${DEST_DIR:-/}" \
   1849   1.1  christos 			"${DEST_DIR}/etc/master.passwd";
   1850   1.1  christos 	then
   1851   1.1  christos 		msg "Can't update format of passwd database"
   1852   1.1  christos 		failed=1
   1853   1.1  christos 	else
   1854   1.1  christos 		msg "Updated format of passwd database"
   1855   1.1  christos 	fi
   1856   1.1  christos 
   1857   1.1  christos 	return ${failed}
   1858   1.1  christos }
   1859   1.1  christos 
   1860  1.37     lukem 
   1861   1.1  christos #
   1862   1.1  christos #	rc
   1863   1.1  christos #
   1864   1.1  christos 
   1865  1.12   tsutsui # There is no info in src/distrib or /etc/mtree which rc* files
   1866  1.12   tsutsui # can be overwritten unconditionally on upgrade. See PR/54741.
   1867  1.12   tsutsui rc_644_files="
   1868  1.12   tsutsui rc
   1869  1.12   tsutsui rc.subr
   1870  1.12   tsutsui rc.shutdown
   1871  1.12   tsutsui "
   1872  1.12   tsutsui 
   1873   1.1  christos rc_obsolete_vars="
   1874   1.1  christos amd amd_master
   1875   1.1  christos btcontrol btcontrol_devices
   1876   1.1  christos critical_filesystems critical_filesystems_beforenet
   1877   1.1  christos mountcritlocal mountcritremote
   1878   1.1  christos network ip6forwarding
   1879   1.1  christos network nfsiod_flags
   1880   1.1  christos sdpd sdpd_control
   1881   1.1  christos sdpd sdpd_groupname
   1882   1.1  christos sdpd sdpd_username
   1883   1.1  christos sysctl defcorename
   1884   1.1  christos "
   1885   1.1  christos 
   1886   1.1  christos update_rc()
   1887   1.1  christos {
   1888   1.1  christos 	local op=$1
   1889   1.1  christos 	local dir=$2
   1890   1.1  christos 	local name=$3
   1891   1.1  christos 	local bindir=$4
   1892   1.1  christos 	local rcdir=$5
   1893   1.1  christos 
   1894   1.1  christos 	if [ ! -x "${DEST_DIR}/${bindir}/${name}" ]; then
   1895   1.1  christos 		return 0
   1896   1.1  christos 	fi
   1897   1.1  christos 
   1898   1.1  christos 	if ! find_file_in_dirlist "${name}" "${name}" \
   1899   1.1  christos 	    "${rcdir}" "${SRC_DIR}/etc/rc.d"; then
   1900   1.1  christos 		return 1
   1901   1.1  christos 	fi
   1902   1.1  christos 	populate_dir "${op}" false "${dir}" "${DEST_DIR}/etc/rc.d" 555 "${name}"
   1903   1.1  christos 	return $?
   1904   1.1  christos }
   1905   1.1  christos 
   1906   1.1  christos # select non-obsolete files in a sets file
   1907   1.1  christos # $1: directory pattern
   1908   1.1  christos # $2: file pattern
   1909   1.1  christos # $3: filename
   1910   1.1  christos select_set_files()
   1911   1.1  christos {
   1912   1.1  christos 	local qdir="$(echo $1 | ${SED} -e s@/@\\\\/@g -e s/\\./\\\\./g)"
   1913   1.1  christos 	${SED} -n -e /obsolete/d \
   1914   1.1  christos 	    -e "/^\.${qdir}/s@^.$2[[:space:]].*@\1@p" $3
   1915   1.1  christos }
   1916   1.1  christos 
   1917   1.4  christos # select obsolete files in a sets file
   1918   1.4  christos # $1: directory pattern
   1919   1.4  christos # $2: file pattern
   1920  1.10  christos # $3: setname
   1921   1.4  christos select_obsolete_files()
   1922   1.4  christos {
   1923  1.10  christos 	if $SOURCEMODE; then
   1924  1.10  christos 		${SED} -n -e "/obsolete/s@\.$1$2[[:space:]].*@\1@p" \
   1925  1.35     lukem 		    "${SRC_DIR}/distrib/sets/lists/$3/mi"
   1926  1.11  christos 		return
   1927  1.11  christos 	fi
   1928  1.11  christos 
   1929  1.11  christos 	# On upgrade builds we don't extract the "etc" set so we
   1930  1.11  christos 	# try to use the source set instead. See PR/54730 for
   1931  1.11  christos 	# ways to better handle this.
   1932  1.11  christos 
   1933  1.11  christos 	local obsolete_dir
   1934  1.11  christos 
   1935  1.11  christos 	if [ $3 = "etc" ] ;then
   1936  1.35     lukem 		obsolete_dir="${SRC_DIR}/var/db/obsolete"
   1937  1.10  christos 	else
   1938  1.35     lukem 		obsolete_dir="${DEST_DIR}/var/db/obsolete"
   1939  1.10  christos 	fi
   1940  1.11  christos 	${SED} -n -e "s@\.$1$2\$@\1@p" "${obsolete_dir}/$3"
   1941   1.4  christos }
   1942   1.4  christos 
   1943   1.1  christos getetcsets()
   1944   1.1  christos {
   1945   1.1  christos 	if $SOURCEMODE; then
   1946   1.1  christos 		echo "${SRC_DIR}/distrib/sets/lists/etc/mi"
   1947   1.1  christos 	else
   1948   1.1  christos 		echo "${SRC_DIR}/etc/mtree/set.etc"
   1949   1.1  christos 	fi
   1950   1.1  christos }
   1951   1.1  christos 
   1952   1.1  christos additem rc "/etc/rc* and /etc/rc.d/ being up to date"
   1953   1.1  christos do_rc()
   1954   1.1  christos {
   1955  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_rc fix|check"
   1956   1.1  christos 	local op="$1"
   1957   1.1  christos 	local failed=0
   1958   1.1  christos 	local generated_scripts=""
   1959   1.1  christos 	local etcsets=$(getetcsets)
   1960   1.1  christos 	if [ "${MKX11}" != "no" ]; then
   1961   1.1  christos 		generated_scripts="${generated_scripts} xdm xfs"
   1962   1.1  christos 	fi
   1963   1.1  christos 
   1964   1.1  christos 	# Directories of external programs that have rc files (in bsd)
   1965  1.26  christos 	local rc_external_files="blocklist nsd unbound"
   1966   1.1  christos 
   1967   1.1  christos 	# rc* files in /etc/
   1968  1.12   tsutsui 	# XXX: at least rc.conf and rc.local shouldn't be updated. PR/54741
   1969  1.12   tsutsui 	#local rc_644_files="$(select_set_files /etc/rc \
   1970  1.12   tsutsui 	#    "/etc/\(rc[^[:space:]/]*\)" ${etcsets})"
   1971   1.1  christos 
   1972   1.1  christos 	# no-obsolete rc files in /etc/rc.d
   1973   1.1  christos 	local rc_555_files="$(select_set_files /etc/rc.d/ \
   1974   1.1  christos 	    "/etc/rc\.d/\([^[:space:]]*\)" ${etcsets} | \
   1975   1.1  christos 	    exclude ${rc_external_files})"
   1976   1.1  christos 
   1977   1.1  christos 	# obsolete rc file in /etc/rc.d
   1978   1.4  christos 	local rc_obsolete_files="$(select_obsolete_files /etc/rc.d/ \
   1979  1.10  christos 	    "\([^[:space:]]*\)" etc)"
   1980   1.1  christos 
   1981   1.1  christos 	compare_dir "${op}" "${SRC_DIR}/etc" "${DEST_DIR}/etc" 644 \
   1982   1.1  christos 		${rc_644_files}
   1983   1.1  christos 	failed=$(( ${failed} + $? ))
   1984   1.1  christos 
   1985   1.1  christos 	local extra_scripts
   1986   1.1  christos 	if ! $SOURCEMODE; then
   1987   1.1  christos 		extra_scripts="${generated_scripts}"
   1988   1.1  christos 	else
   1989   1.1  christos 		extra_scripts=""
   1990   1.1  christos 	fi
   1991   1.1  christos 
   1992   1.1  christos 	compare_dir "${op}" "${SRC_DIR}/etc/rc.d" "${DEST_DIR}/etc/rc.d" 555 \
   1993   1.1  christos 		${rc_555_files} \
   1994   1.1  christos 		${extra_scripts}
   1995   1.1  christos 	failed=$(( ${failed} + $? ))
   1996   1.1  christos 
   1997   1.1  christos 	for i in ${rc_external_files}; do
   1998  1.28  riastrad 	    local rc_file
   1999   1.1  christos 	    case $i in
   2000   1.1  christos 	    *d) rc_file=${i};;
   2001   1.1  christos 	    *)	rc_file=${i}d;;
   2002   1.1  christos 	    esac
   2003  1.28  riastrad 
   2004   1.1  christos 	    update_rc "${op}" "${dir}" ${rc_file} /sbin \
   2005   1.1  christos 		"${SRC_DIR}/external/bsd/$i/etc/rc.d"
   2006   1.1  christos 	    failed=$(( ${failed} + $? ))
   2007   1.1  christos 	done
   2008   1.1  christos 
   2009   1.1  christos 	if $SOURCEMODE && [ -n "${generated_scripts}" ]; then
   2010   1.1  christos 		# generate scripts
   2011   1.1  christos 		mkdir "${SCRATCHDIR}/rc"
   2012   1.1  christos 		for f in ${generated_scripts}; do
   2013   1.1  christos 			${SED} -e "s,@X11ROOTDIR@,${X11ROOTDIR},g" \
   2014   1.1  christos 			    < "${SRC_DIR}/etc/rc.d/${f}.in" \
   2015   1.1  christos 			    > "${SCRATCHDIR}/rc/${f}"
   2016   1.1  christos 		done
   2017   1.1  christos 		compare_dir "${op}" "${SCRATCHDIR}/rc" \
   2018   1.1  christos 		    "${DEST_DIR}/etc/rc.d" 555 \
   2019   1.1  christos 		    ${generated_scripts}
   2020   1.1  christos 		failed=$(( ${failed} + $? ))
   2021   1.1  christos 	fi
   2022   1.1  christos 
   2023   1.1  christos 		# check for obsolete rc.d files
   2024   1.1  christos 	for f in ${rc_obsolete_files}; do
   2025   1.1  christos 		local fd="/etc/rc.d/${f}"
   2026   1.1  christos 		[ -e "${DEST_DIR}${fd}" ] && echo "${fd}"
   2027   1.1  christos 	done | obsolete_paths "${op}"
   2028   1.1  christos 	failed=$(( ${failed} + $? ))
   2029   1.1  christos 
   2030   1.1  christos 		# check for obsolete rc.conf(5) variables
   2031   1.1  christos 	set -- ${rc_obsolete_vars}
   2032   1.1  christos 	while [ $# -gt 1 ]; do
   2033   1.1  christos 		if rcconf_is_set "${op}" "$1" "$2" 1; then
   2034   1.1  christos 			failed=1
   2035   1.1  christos 		fi
   2036   1.1  christos 		shift 2
   2037   1.1  christos 	done
   2038   1.1  christos 
   2039   1.1  christos 	return ${failed}
   2040   1.1  christos }
   2041   1.1  christos 
   2042  1.37     lukem 
   2043   1.1  christos #
   2044   1.1  christos #	sendmail
   2045   1.1  christos #
   2046  1.37     lukem 
   2047   1.1  christos adddisableditem sendmail "remove obsolete sendmail configuration files and scripts"
   2048   1.1  christos do_sendmail()
   2049   1.1  christos {
   2050  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_sendmail fix|check"
   2051   1.1  christos 	op="$1"
   2052   1.1  christos 	failed=0
   2053   1.1  christos 
   2054   1.1  christos 	# Don't complain if the "sendmail" package is installed because the
   2055   1.1  christos 	# files might still be in use.
   2056   1.1  christos 	if /usr/sbin/pkg_info -qe sendmail >/dev/null 2>&1; then
   2057   1.1  christos 		return 0
   2058   1.1  christos 	fi
   2059   1.1  christos 
   2060   1.1  christos 	for f in /etc/mail/helpfile /etc/mail/local-host-names \
   2061   1.1  christos 	    /etc/mail/sendmail.cf /etc/mail/submit.cf /etc/rc.d/sendmail \
   2062   1.1  christos 	    /etc/rc.d/smmsp /usr/share/misc/sendmail.hf \
   2063   1.1  christos 	    $( ( find "${DEST_DIR}/usr/share/sendmail" -type f ; \
   2064   1.1  christos 	         find "${DEST_DIR}/usr/share/sendmail" -type d \
   2065   1.1  christos 	       ) | unprefix "${DEST_DIR}" ) \
   2066   1.1  christos 	    /var/log/sendmail.st \
   2067   1.1  christos 	    /var/spool/clientmqueue \
   2068   1.1  christos 	    /var/spool/mqueue
   2069   1.1  christos 	do
   2070   1.1  christos 		[ -e "${DEST_DIR}${f}" ] && echo "${f}"
   2071   1.1  christos 	done | obsolete_paths "${op}"
   2072   1.1  christos 	failed=$(( ${failed} + $? ))
   2073   1.1  christos 
   2074   1.1  christos 	return ${failed}
   2075   1.1  christos }
   2076   1.1  christos 
   2077   1.1  christos 
   2078   1.1  christos #
   2079   1.1  christos #	ssh
   2080   1.1  christos #
   2081  1.37     lukem 
   2082   1.1  christos additem ssh "ssh configuration update"
   2083   1.1  christos do_ssh()
   2084   1.1  christos {
   2085  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_ssh fix|check"
   2086   1.1  christos 	op="$1"
   2087   1.1  christos 
   2088   1.1  christos 	failed=0
   2089   1.1  christos 	_etcssh="${DEST_DIR}/etc/ssh"
   2090   1.1  christos 	if ! check_dir "${op}" "${_etcssh}" 755; then
   2091   1.1  christos 		failed=1
   2092   1.1  christos 	fi
   2093   1.1  christos 
   2094   1.1  christos 	if [ ${failed} -eq 0 ]; then
   2095   1.1  christos 		for f in \
   2096   1.1  christos 			    ssh_known_hosts ssh_known_hosts2 \
   2097   1.1  christos 			    ssh_host_dsa_key ssh_host_dsa_key.pub \
   2098   1.1  christos 			    ssh_host_rsa_key ssh_host_rsa_key.pub \
   2099   1.1  christos 			    ssh_host_key ssh_host_key.pub \
   2100   1.1  christos 		    ; do
   2101   1.1  christos 			if ! move_file "${op}" \
   2102   1.1  christos 			    "${DEST_DIR}/etc/${f}" "${_etcssh}/${f}" ; then
   2103   1.1  christos 				failed=1
   2104   1.1  christos 			fi
   2105   1.1  christos 		done
   2106   1.1  christos 		for f in sshd.conf ssh.conf ; do
   2107   1.1  christos 				# /etc/ssh/ssh{,d}.conf -> ssh{,d}_config
   2108   1.1  christos 				#
   2109   1.1  christos 			if ! move_file "${op}" \
   2110   1.1  christos 			    "${_etcssh}/${f}" "${_etcssh}/${f%.conf}_config" ;
   2111   1.1  christos 			then
   2112   1.1  christos 				failed=1
   2113   1.1  christos 			fi
   2114   1.1  christos 				# /etc/ssh{,d}.conf -> /etc/ssh/ssh{,d}_config
   2115   1.1  christos 				#
   2116   1.1  christos 			if ! move_file "${op}" \
   2117   1.1  christos 			    "${DEST_DIR}/etc/${f}" \
   2118   1.1  christos 			    "${_etcssh}/${f%.conf}_config" ;
   2119   1.1  christos 			then
   2120   1.1  christos 				failed=1
   2121   1.1  christos 			fi
   2122   1.1  christos 		done
   2123   1.1  christos 	fi
   2124   1.1  christos 
   2125   1.1  christos 	sshdconf=""
   2126   1.1  christos 	for f in \
   2127   1.1  christos 	    "${_etcssh}/sshd_config" \
   2128   1.1  christos 	    "${_etcssh}/sshd.conf" \
   2129   1.1  christos 	    "${DEST_DIR}/etc/sshd.conf" ; do
   2130   1.1  christos 		if [ -f "${f}" ]; then
   2131   1.1  christos 			sshdconf="${f}"
   2132   1.1  christos 			break
   2133   1.1  christos 		fi
   2134   1.1  christos 	done
   2135   1.1  christos 	if [ -n "${sshdconf}" ]; then
   2136   1.1  christos 		modify_file "${op}" "${sshdconf}" "${SCRATCHDIR}/sshdconf" '
   2137   1.1  christos 			/^[^#$]/ {
   2138   1.1  christos 				kw = tolower($1)
   2139   1.1  christos 				if (kw == "hostkey" &&
   2140   1.1  christos 				    $2 ~ /^\/etc\/+ssh_host(_[dr]sa)?_key$/ ) {
   2141   1.1  christos 					sub(/\/etc\/+/, "/etc/ssh/")
   2142   1.1  christos 				}
   2143   1.1  christos 				if (kw == "rhostsauthentication" ||
   2144   1.1  christos 				    kw == "verifyreversemapping" ||
   2145   1.1  christos 				    kw == "reversemappingcheck") {
   2146   1.1  christos 					sub(/^/, "# DEPRECATED:\t")
   2147   1.1  christos 				}
   2148   1.1  christos 			}
   2149   1.1  christos 			{ print }
   2150   1.1  christos 		'
   2151   1.1  christos 		failed=$(( ${failed} + $? ))
   2152   1.1  christos 	fi
   2153   1.1  christos 
   2154   1.1  christos 	if ! find_file_in_dirlist moduli "moduli" \
   2155   1.1  christos 	    "${SRC_DIR}/crypto/external/bsd/openssh/dist" "${SRC_DIR}/etc" ; then
   2156   1.1  christos 		failed=1
   2157   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   2158   1.1  christos 	elif ! compare_dir "${op}" "${dir}" "${DEST_DIR}/etc" 444 moduli; then
   2159   1.1  christos 		failed=1
   2160   1.1  christos 	fi
   2161   1.1  christos 
   2162   1.1  christos 	if ! check_dir "${op}" "${DEST_DIR}/var/chroot/sshd" 755 ; then
   2163   1.1  christos 		failed=1
   2164   1.1  christos 	fi
   2165   1.1  christos 
   2166   1.1  christos 	if rcconf_is_set "${op}" sshd sshd_conf_dir 1; then
   2167   1.1  christos 		failed=1
   2168   1.1  christos 	fi
   2169   1.1  christos 
   2170   1.1  christos 	return ${failed}
   2171   1.1  christos }
   2172   1.1  christos 
   2173  1.37     lukem 
   2174   1.1  christos #
   2175  1.37     lukem #	tcpdumpchroot
   2176   1.1  christos #
   2177  1.37     lukem 
   2178  1.37     lukem additem tcpdumpchroot "remove /var/chroot/tcpdump/etc/protocols"
   2179  1.37     lukem do_tcpdumpchroot()
   2180   1.1  christos {
   2181  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_tcpdumpchroot fix|check"
   2182  1.37     lukem 
   2183  1.37     lukem 	failed=0;
   2184  1.37     lukem 	if [ -r "${DEST_DIR}/var/chroot/tcpdump/etc/protocols" ]; then
   2185  1.37     lukem 		if [ "$1" = "fix" ]; then
   2186  1.37     lukem 			rm "${DEST_DIR}/var/chroot/tcpdump/etc/protocols"
   2187  1.37     lukem 			failed=$(( ${failed} + $? ))
   2188  1.37     lukem 			rmdir "${DEST_DIR}/var/chroot/tcpdump/etc"
   2189  1.37     lukem 			failed=$(( ${failed} + $? ))
   2190  1.37     lukem 		else
   2191  1.37     lukem 			failed=1
   2192  1.37     lukem 		fi
   2193  1.37     lukem 	fi
   2194  1.37     lukem 	return ${failed}
   2195  1.37     lukem }
   2196  1.37     lukem 
   2197  1.37     lukem 
   2198  1.37     lukem #
   2199  1.37     lukem #	uid
   2200  1.37     lukem #
   2201  1.37     lukem 
   2202  1.37     lukem additem uid "required users in /etc/master.passwd"
   2203  1.37     lukem do_uid()
   2204  1.37     lukem {
   2205  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_uid fix|check"
   2206  1.37     lukem 
   2207  1.37     lukem 	check_ids "$1" users "${DEST_DIR}/etc/master.passwd" \
   2208  1.37     lukem 	    "${SRC_DIR}/etc/master.passwd" 12 \
   2209  1.37     lukem 	    postfix SKIP named ntpd sshd SKIP _pflogd _rwhod SKIP _proxy \
   2210  1.37     lukem 	    _timedc _sdpd _httpd _mdnsd _tests _tcpdump _tss SKIP _rtadvd \
   2211  1.37     lukem 	    SKIP _unbound _nsd SKIP _dhcpcd
   2212  1.37     lukem }
   2213  1.37     lukem 
   2214  1.37     lukem 
   2215  1.37     lukem #
   2216  1.37     lukem #	varrwho
   2217  1.37     lukem #
   2218  1.37     lukem 
   2219  1.37     lukem additem varrwho "required ownership of files in /var/rwho"
   2220  1.37     lukem do_varrwho()
   2221  1.37     lukem {
   2222  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_varrwho fix|check"
   2223  1.37     lukem 
   2224  1.37     lukem 	contents_owner "$1" "${DEST_DIR}/var/rwho" _rwhod _rwhod
   2225  1.37     lukem }
   2226  1.37     lukem 
   2227  1.37     lukem 
   2228  1.37     lukem #
   2229  1.37     lukem #	varshm
   2230  1.37     lukem #
   2231  1.37     lukem 
   2232  1.37     lukem additem varshm "check for a tmpfs mounted on /var/shm"
   2233  1.37     lukem do_varshm()
   2234  1.37     lukem {
   2235  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_varshm fix|check"
   2236  1.37     lukem 	op="$1"
   2237  1.37     lukem 	failed=0
   2238  1.37     lukem 
   2239  1.37     lukem 	[ -f "${DEST_DIR}/etc/fstab" ] || return 0
   2240  1.37     lukem 	if ${GREP} -E "^var_shm_symlink" "${DEST_DIR}/etc/rc.conf" >/dev/null 2>&1;
   2241  1.37     lukem 	then
   2242  1.37     lukem 		failed=0;
   2243  1.37     lukem 	elif ${GREP} -w "/var/shm" "${DEST_DIR}/etc/fstab" >/dev/null 2>&1;
   2244  1.37     lukem 	then
   2245  1.37     lukem 		failed=0;
   2246  1.37     lukem 	else
   2247  1.37     lukem 		if [ "${op}" = "check" ]; then
   2248  1.37     lukem 			failed=1
   2249  1.37     lukem 			msg "No /var/shm mount found in ${DEST_DIR}/etc/fstab"
   2250  1.37     lukem 		elif [ "${op}" = "fix" ]; then
   2251  1.37     lukem 			printf '\ntmpfs\t/var/shm\ttmpfs\trw,-m1777,-sram%%25\n' \
   2252  1.37     lukem 				>> "${DEST_DIR}/etc/fstab"
   2253  1.37     lukem 			msg "Added tmpfs with 25% ram limit as /var/shm"
   2254  1.37     lukem 
   2255  1.37     lukem 		fi
   2256  1.37     lukem 	fi
   2257  1.37     lukem 
   2258  1.37     lukem 	return ${failed}
   2259  1.37     lukem }
   2260  1.37     lukem 
   2261  1.37     lukem 
   2262  1.37     lukem #
   2263  1.37     lukem #	wscons
   2264  1.37     lukem #
   2265  1.37     lukem 
   2266  1.37     lukem additem wscons "wscons configuration file update"
   2267  1.37     lukem do_wscons()
   2268  1.37     lukem {
   2269  1.37     lukem 	[ -n "$1" ] || err 3 "USAGE: do_wscons fix|check"
   2270  1.37     lukem 	op="$1"
   2271   1.1  christos 
   2272   1.1  christos 	[ -f "${DEST_DIR}/etc/wscons.conf" ] || return 0
   2273   1.1  christos 
   2274   1.1  christos 	failed=0
   2275   1.1  christos 	notfixed=""
   2276   1.1  christos 	if [ "${op}" = "fix" ]; then
   2277   1.1  christos 		notfixed="${NOT_FIXED}"
   2278   1.1  christos 	fi
   2279   1.1  christos 	while read _type _arg1 _rest; do
   2280   1.1  christos 		if [ "${_type}" = "mux" -a "${_arg1}" = "1" ]; then
   2281   1.1  christos 			msg \
   2282   1.1  christos     "Obsolete wscons.conf(5) entry \""${_type} ${_arg1}"\" found.${notfixed}"
   2283   1.1  christos 			failed=1
   2284   1.1  christos 		fi
   2285   1.1  christos 	done < "${DEST_DIR}/etc/wscons.conf"
   2286   1.1  christos 
   2287   1.1  christos 	return ${failed}
   2288   1.1  christos }
   2289   1.1  christos 
   2290  1.37     lukem 
   2291   1.1  christos #
   2292  1.37     lukem #	x11
   2293   1.1  christos #
   2294  1.37     lukem 
   2295   1.1  christos additem x11 "x11 configuration update"
   2296   1.1  christos do_x11()
   2297   1.1  christos {
   2298  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_x11 fix|check"
   2299   1.1  christos 	op="$1"
   2300   1.1  christos 
   2301   1.1  christos 	failed=0
   2302   1.1  christos 	_etcx11="${DEST_DIR}/etc/X11"
   2303  1.42     lukem 	_libx11=""
   2304   1.1  christos 	if [ ! -d "${_etcx11}" ]; then
   2305   1.1  christos 		msg "${_etcx11} is not a directory; skipping check"
   2306   1.1  christos 		return 0
   2307   1.1  christos 	fi
   2308   1.1  christos 	if [ -d "${DEST_DIR}/usr/X11R6/." ]
   2309   1.1  christos 	then
   2310   1.1  christos 		_libx11="${DEST_DIR}/usr/X11R6/lib/X11"
   2311   1.1  christos 		if [ ! -d "${_libx11}" ]; then
   2312   1.1  christos 			msg "${_libx11} is not a directory; skipping check"
   2313   1.1  christos 			return 0
   2314   1.1  christos 		fi
   2315   1.1  christos 	fi
   2316   1.1  christos 
   2317   1.1  christos 	_notfixed=""
   2318   1.1  christos 	if [ "${op}" = "fix" ]; then
   2319   1.1  christos 		_notfixed="${NOT_FIXED}"
   2320   1.1  christos 	fi
   2321   1.1  christos 
   2322  1.42     lukem 	# check if /usr/X11R6/lib/X11 needs to migrate to /etc/X11
   2323  1.42     lukem 	if [ -n "${_libx11}" ]; then
   2324  1.42     lukem 		for d in \
   2325  1.42     lukem 			    fs lbxproxy proxymngr rstart twm xdm xinit xserver xsm \
   2326  1.42     lukem 		    ; do
   2327  1.42     lukem 			sd="${_libx11}/${d}"
   2328  1.42     lukem 			ld="/etc/X11/${d}"
   2329  1.42     lukem 			td="${DEST_DIR}${ld}"
   2330  1.42     lukem 			if [ -h "${sd}" ]; then
   2331  1.42     lukem 				continue
   2332  1.42     lukem 			elif [ -d "${sd}" ]; then
   2333  1.42     lukem 				tdfiles="$(find "${td}" \! -type d)"
   2334  1.42     lukem 				if [ -n "${tdfiles}" ]; then
   2335  1.42     lukem 					msg "${sd} exists yet ${td} already" \
   2336  1.42     lukem 					    "contains files${_notfixed}"
   2337  1.42     lukem 				else
   2338  1.42     lukem 					msg "Migrate ${sd} to ${td}${_notfixed}"
   2339  1.42     lukem 				fi
   2340  1.42     lukem 				failed=1
   2341  1.42     lukem 			elif [ -e "${sd}" ]; then
   2342  1.42     lukem 				msg "Unexpected file ${sd}${_notfixed}"
   2343  1.42     lukem 				continue
   2344   1.1  christos 			else
   2345  1.42     lukem 				continue
   2346   1.1  christos 			fi
   2347  1.42     lukem 		done
   2348  1.42     lukem 	fi
   2349   1.1  christos 
   2350   1.1  christos 	# check if xdm resources have been updated
   2351   1.1  christos 	if [ -r ${_etcx11}/xdm/Xresources ] && \
   2352   1.1  christos 	    ! ${GREP} 'inpColor:' ${_etcx11}/xdm/Xresources > /dev/null; then
   2353   1.1  christos 		msg "Update ${_etcx11}/xdm/Xresources${_notfixed}"
   2354   1.1  christos 		failed=1
   2355   1.1  christos 	fi
   2356   1.1  christos 
   2357   1.1  christos 	return ${failed}
   2358   1.1  christos }
   2359   1.1  christos 
   2360  1.37     lukem 
   2361   1.1  christos #
   2362   1.1  christos #	xkb
   2363   1.1  christos #
   2364   1.1  christos # /usr/X11R7/lib/X11/xkb/symbols/pc used to be a directory, but changed
   2365   1.1  christos # to a file on 2009-06-12.  Fixing this requires removing the directory
   2366   1.1  christos # (which we can do) and re-extracting the xbase set (which we can't do),
   2367   1.1  christos # or at least adding that one file (which we may be able to do if X11SRCDIR
   2368   1.1  christos # is available).
   2369   1.1  christos #
   2370  1.37     lukem 
   2371   1.1  christos additem xkb "clean up for xkbdata to xkeyboard-config upgrade"
   2372   1.1  christos do_xkb()
   2373   1.1  christos {
   2374  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_xkb fix|check"
   2375   1.1  christos 	op="$1"
   2376   1.1  christos 	failed=0
   2377   1.1  christos 
   2378   1.1  christos 	pcpath="/usr/X11R7/lib/X11/xkb/symbols/pc"
   2379   1.1  christos 	pcsrcdir="${X11SRCDIR}/external/mit/xkeyboard-config/dist/symbols"
   2380   1.1  christos 
   2381   1.1  christos 	filemsg="\
   2382   1.1  christos ${pcpath} was a directory, should be a file.
   2383   1.1  christos     To fix, extract the xbase set again."
   2384   1.1  christos 
   2385   1.1  christos 	_notfixed=""
   2386   1.1  christos 	if [ "${op}" = "fix" ]; then
   2387   1.1  christos 		_notfixed="${NOT_FIXED}"
   2388   1.1  christos 	fi
   2389   1.1  christos 
   2390   1.1  christos 	if [ ! -d "${DEST_DIR}${pcpath}" ]; then
   2391   1.1  christos 		return 0
   2392   1.1  christos 	fi
   2393   1.1  christos 
   2394   1.1  christos 	# Delete obsolete files in the directory, and the directory
   2395   1.1  christos 	# itself.  If the directory contains unexpected extra files
   2396   1.1  christos 	# then it will not be deleted.
   2397   1.1  christos 	( [ -f "${DEST_DIR}"/var/db/obsolete/xbase ] \
   2398   1.1  christos 	    &&  ${SORT} -ru "${DEST_DIR}"/var/db/obsolete/xbase \
   2399   1.1  christos 	    | ${GREP} -E "^\\.?${pcpath}/" ;
   2400   1.1  christos 	    echo "${pcpath}" ) \
   2401   1.1  christos 	| obsolete_paths "${op}"
   2402   1.1  christos 	failed=$(( ${failed} + $? ))
   2403   1.1  christos 
   2404   1.1  christos 	# If the directory was removed above, then try to replace it with
   2405   1.1  christos 	# a file.
   2406   1.1  christos 	if [ -d "${DEST_DIR}${pcpath}" ]; then
   2407   1.1  christos 		msg "${filemsg}${_notfixed}"
   2408   1.1  christos 		failed=$(( ${failed} + 1 ))
   2409   1.1  christos 	else
   2410   1.1  christos 		if ! find_file_in_dirlist pc "${pcpath}" \
   2411   1.1  christos 			"${pcsrcdir}" "${SRC_DIR}${pcpath%/*}"
   2412   1.1  christos 		then
   2413   1.1  christos 			msg "${filemsg}${_notfixed}"
   2414   1.1  christos 			failed=$(( ${failed} + 1 ))
   2415   1.1  christos 		else
   2416   1.1  christos 			# ${dir} is set by find_file_in_dirlist()
   2417   1.1  christos 			populate_dir "${op}" true \
   2418   1.1  christos 				"${dir}" "${DEST_DIR}${pcpath%/*}" 444 \
   2419   1.1  christos 				pc
   2420   1.1  christos 			failed=$(( ${failed} + $? ))
   2421   1.1  christos 		fi
   2422   1.1  christos 	fi
   2423   1.1  christos 
   2424   1.1  christos 	return $failed
   2425   1.1  christos }
   2426   1.1  christos 
   2427   1.1  christos 
   2428   1.1  christos #
   2429  1.37     lukem #	obsolete_stand
   2430  1.37     lukem #	obsolete_stand_debug
   2431   1.1  christos #
   2432   1.1  christos 
   2433  1.21  christos obsolete_stand_internal()
   2434   1.1  christos {
   2435  1.21  christos 	local prefix="$1"
   2436  1.21  christos 	shift
   2437  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_obsolete_stand fix|check"
   2438  1.21  christos 	local op="$1"
   2439  1.21  christos 	local failed=0
   2440   1.1  christos 
   2441   1.1  christos 	for dir in \
   2442  1.21  christos 	    ${prefix}/stand/${MACHINE} \
   2443  1.21  christos 	    ${prefix}/stand/${MACHINE}-4xx \
   2444  1.21  christos 	    ${prefix}/stand/${MACHINE}-booke \
   2445  1.21  christos 	    ${prefix}/stand/${MACHINE}-xen \
   2446  1.21  christos 	    ${prefix}/stand/${MACHINE}pae-xen
   2447   1.1  christos 	do
   2448  1.34     lukem 		[ -d "${DEST_DIR}${dir}" ] && obsolete_stand "${dir}"
   2449   1.1  christos 	done | obsolete_paths "${op}"
   2450   1.1  christos 	failed=$(( ${failed} + $? ))
   2451   1.1  christos 
   2452   1.1  christos 	return ${failed}
   2453   1.1  christos }
   2454   1.1  christos 
   2455  1.21  christos adddisableditem obsolete_stand "remove obsolete files from /stand"
   2456  1.21  christos do_obsolete_stand()
   2457  1.21  christos {
   2458  1.21  christos 	obsolete_stand_internal "" "$@"
   2459  1.21  christos 	return $?
   2460  1.21  christos }
   2461  1.21  christos 
   2462  1.21  christos adddisableditem obsolete_stand_debug "remove obsolete files from /usr/libdata/debug/stand"
   2463  1.21  christos do_obsolete_stand_debug()
   2464  1.21  christos {
   2465  1.21  christos 	obsolete_stand_internal "/usr/libdata/debug" "$@"
   2466  1.21  christos 	return $?
   2467  1.21  christos }
   2468  1.21  christos 
   2469  1.37     lukem 
   2470  1.37     lukem #
   2471  1.37     lukem #	obsolete
   2472  1.37     lukem #
   2473  1.37     lukem # NOTE: This item is last to allow other items to move obsolete files.
   2474  1.37     lukem #
   2475  1.37     lukem 
   2476  1.37     lukem listarchsubdirs()
   2477  1.37     lukem {
   2478   1.1  christos 	if ! $SOURCEMODE; then
   2479   1.1  christos 		echo "@ARCHSUBDIRS@"
   2480   1.2  christos 	else
   2481   1.2  christos 		${SED} -n -e '/ARCHDIR_SUBDIR/s/[[:space:]]//gp' \
   2482  1.35     lukem 		    "${SRC_DIR}/compat/archdirs.mk"
   2483   1.1  christos 	fi
   2484   1.2  christos }
   2485   1.2  christos 
   2486  1.37     lukem getarchsubdirs()
   2487  1.37     lukem {
   2488   1.1  christos 	local m
   2489   1.1  christos 	case ${MACHINE_ARCH} in
   2490   1.1  christos 	*arm*|*aarch64*)	m=arm;;
   2491   1.1  christos 	x86_64)			m=amd64;;
   2492   1.1  christos 	*)			m=${MACHINE_ARCH};;
   2493   1.1  christos 	esac
   2494   1.1  christos 
   2495   1.2  christos 	for i in $(listarchsubdirs); do
   2496   1.2  christos 		echo $i
   2497   1.2  christos 	done | ${SORT} -u | ${SED} -n -e "/=${m}/s@.*=${m}/\(.*\)@\1@p"
   2498   1.1  christos }
   2499   1.1  christos 
   2500  1.37     lukem getcompatlibdirs()
   2501  1.37     lukem {
   2502   1.1  christos 	for i in $(getarchsubdirs); do
   2503   1.7  nakayama 		if [ -d "${DEST_DIR}/usr/lib/$i" ]; then
   2504   1.1  christos 			echo /usr/lib/$i
   2505   1.1  christos 		fi
   2506   1.1  christos 	done
   2507   1.1  christos }
   2508   1.1  christos 
   2509   1.1  christos additem obsolete "remove obsolete file sets and minor libraries"
   2510   1.1  christos do_obsolete()
   2511   1.1  christos {
   2512  1.36     lukem 	[ -n "$1" ] || err 3 "USAGE: do_obsolete fix|check"
   2513   1.1  christos 	op="$1"
   2514   1.1  christos 	failed=0
   2515   1.1  christos 
   2516   1.1  christos 	${SORT} -ru "${DEST_DIR}"/var/db/obsolete/* | obsolete_paths "${op}"
   2517   1.1  christos 	failed=$(( ${failed} + $? ))
   2518   1.1  christos 
   2519   1.1  christos 	(
   2520   1.1  christos 		obsolete_libs /lib
   2521   1.1  christos 		obsolete_libs /usr/lib
   2522   1.1  christos 		obsolete_libs /usr/lib/i18n
   2523   1.1  christos 		obsolete_libs /usr/X11R6/lib
   2524   1.1  christos 		obsolete_libs /usr/X11R7/lib
   2525   1.1  christos 		for i in $(getcompatlibdirs); do
   2526   1.1  christos 			obsolete_libs $i
   2527   1.1  christos 		done
   2528   1.1  christos 	) | obsolete_paths "${op}"
   2529   1.1  christos 	failed=$(( ${failed} + $? ))
   2530   1.1  christos 
   2531   1.1  christos 	return ${failed}
   2532   1.1  christos }
   2533   1.1  christos 
   2534  1.37     lukem 
   2535   1.1  christos #
   2536   1.1  christos #	end of items
   2537   1.1  christos #	------------
   2538   1.1  christos #
   2539   1.1  christos 
   2540   1.1  christos 
   2541  1.43     lukem help()
   2542   1.1  christos {
   2543  1.43     lukem 	cat << _USAGE_
   2544  1.46     lukem Usage: ${PROGNAME} [-a ARCH] [-d DEST_DIR] [-m MACHINE] [-s SRC_DIR] [-x XSRC_DIR] OPERATION ...
   2545   1.1  christos 	Perform post-installation checks and/or fixes on a system's
   2546   1.1  christos 	configuration files.
   2547   1.1  christos 	If no items are provided, a default set of checks or fixes is applied.
   2548   1.1  christos 
   2549   1.1  christos 	Options:
   2550  1.46     lukem 	-a ARCH		\$MACHINE_ARCH.			[${MACHINE_ARCH}]
   2551  1.46     lukem 	-d DEST_DIR	Destination directory to check. [${DEST_DIR:-/}]
   2552  1.46     lukem 	-m MACHINE	\$MACHINE.			[${MACHINE}]
   2553  1.46     lukem 	-s SRC_DIR	Location of the source files.  This may be any of
   2554  1.46     lukem 			the following:
   2555   1.1  christos 			* A directory that contains a NetBSD source tree;
   2556   1.1  christos 			* A distribution set file such as "etc.tgz" or
   2557   1.1  christos 			  "xetc.tgz".  Pass multiple -s options to specify
   2558   1.1  christos 			  multiple such files;
   2559   1.1  christos 			* A temporary directory in which one or both of
   2560   1.1  christos 			  "etc.tgz" and "xetc.tgz" have been extracted.
   2561   1.1  christos 							[${SRC_DIR:-/usr/src}]
   2562  1.46     lukem 	-x XSRC_DIR	Location of the X11 source files.  This must be
   2563   1.1  christos 			a directory that contains a NetBSD xsrc tree.
   2564   1.1  christos 							[${XSRC_DIR:-/usr/src/../xsrc}]
   2565  1.46     lukem 
   2566  1.46     lukem 	Supported values for OPERATION:
   2567  1.46     lukem 	help		Display this help.
   2568  1.46     lukem 	list		List available items.
   2569  1.46     lukem 	check ITEM ...	Perform post-installation checks on ITEMs.
   2570  1.46     lukem 	diff [DIFFOPT] ITEM ...
   2571  1.46     lukem 			Similar to 'check' but also output difference of files,
   2572  1.46     lukem 			using diff [DIFFOPT].
   2573  1.46     lukem 	fix ITEM ...	Apply fixes that 'check' determines need to be applied.
   2574  1.46     lukem 	usage		Display this usage.
   2575   1.1  christos _USAGE_
   2576  1.43     lukem }
   2577  1.43     lukem 
   2578  1.43     lukem usage()
   2579  1.43     lukem {
   2580  1.43     lukem 	help 1>&2
   2581   1.1  christos 	exit 2
   2582   1.1  christos }
   2583   1.1  christos 
   2584   1.1  christos 
   2585   1.1  christos list()
   2586   1.1  christos {
   2587   1.1  christos 	echo "Default set of items (to apply if no items are provided by user):"
   2588  1.38     lukem 	echo " Item                 Description"
   2589  1.38     lukem 	echo " ----                 -----------"
   2590   1.1  christos 	for i in ${defaultitems}; do
   2591   1.1  christos 		eval desc=\"\${desc_${i}}\"
   2592  1.38     lukem 		printf " %-20s %s\n" "${i}" "${desc}"
   2593   1.1  christos 	done
   2594   1.1  christos 	echo "Items disabled by default (must be requested explicitly):"
   2595  1.38     lukem 	echo " Item                 Description"
   2596  1.38     lukem 	echo " ----                 -----------"
   2597   1.1  christos 	for i in ${otheritems}; do
   2598   1.1  christos 		eval desc=\"\${desc_${i}}\"
   2599  1.38     lukem 		printf " %-20s %s\n" "${i}" "${desc}"
   2600   1.1  christos 	done
   2601   1.1  christos }
   2602   1.1  christos 
   2603   1.1  christos 
   2604   1.1  christos main()
   2605   1.1  christos {
   2606  1.44     lukem 	DIRMODE=false		# true if "-s" specified a directory
   2607  1.45     lukem 	ITEMS=			# items to check|diff|fix. [${defaultitems}]
   2608  1.44     lukem 	N_SRC_ARGS=0		# number of "-s" args in SRC_ARGLIST
   2609  1.44     lukem 	SOURCEMODE=false	# true if "-s" specified a source directory
   2610   1.1  christos 	SRC_ARGLIST=		# quoted list of one or more "-s" args
   2611   1.1  christos 	SRC_DIR="${SRC_ARG}"	# set default value for early usage()
   2612  1.44     lukem 	TGZLIST=		# quoted list list of tgz files
   2613  1.44     lukem 	TGZMODE=false		# true if "-s" specifies a tgz file
   2614   1.1  christos 	XSRC_DIR="${SRC_ARG}/../xsrc"
   2615  1.44     lukem 	XSRC_DIR_FIX=
   2616   1.1  christos 
   2617   1.1  christos 	case "$(uname -s)" in
   2618   1.1  christos 	Darwin)
   2619   1.1  christos 		# case sensitive match for case insensitive fs
   2620   1.1  christos 		file_exists_exact=file_exists_exact
   2621   1.1  christos 		;;
   2622   1.1  christos 	*)
   2623   1.1  christos 		file_exists_exact=:
   2624   1.1  christos 		;;
   2625   1.1  christos 	esac
   2626   1.1  christos 
   2627  1.45     lukem 		# Validate options.
   2628  1.45     lukem 		#
   2629  1.46     lukem 	while getopts a:d:m:s:x: ch; do
   2630   1.1  christos 		case "${ch}" in
   2631  1.46     lukem 		a)
   2632  1.46     lukem 			MACHINE_ARCH="${OPTARG}"
   2633  1.46     lukem 			;;
   2634  1.46     lukem 		d)
   2635  1.46     lukem 			DEST_DIR="${OPTARG}"
   2636  1.46     lukem 			;;
   2637  1.46     lukem 		m)
   2638  1.46     lukem 			MACHINE="${OPTARG}"
   2639  1.46     lukem 			;;
   2640   1.1  christos 		s)
   2641   1.1  christos 			qarg="$(shell_quote "${OPTARG}")"
   2642   1.1  christos 			N_SRC_ARGS=$(( $N_SRC_ARGS + 1 ))
   2643   1.1  christos 			SRC_ARGLIST="${SRC_ARGLIST}${SRC_ARGLIST:+ }-s ${qarg}"
   2644   1.1  christos 			if [ -f "${OPTARG}" ]; then
   2645   1.1  christos 				# arg refers to a *.tgz file.
   2646   1.1  christos 				# This may happen twice, for both
   2647   1.1  christos 				# etc.tgz and xetc.tgz, so we build up a
   2648   1.1  christos 				# quoted list in TGZLIST.
   2649   1.1  christos 				TGZMODE=true
   2650   1.1  christos 				TGZLIST="${TGZLIST}${TGZLIST:+ }${qarg}"
   2651   1.1  christos 				# Note that, when TGZMODE is true,
   2652   1.1  christos 				# SRC_ARG is used only for printing
   2653   1.1  christos 				# human-readable messages.
   2654   1.1  christos 				SRC_ARG="${TGZLIST}"
   2655   1.1  christos 			elif [ -d "${OPTARG}" ]; then
   2656   1.1  christos 				# arg refers to a directory.
   2657   1.1  christos 				# It might be a source directory, or a
   2658   1.1  christos 				# directory where the sets have already
   2659   1.1  christos 				# been extracted.
   2660   1.1  christos 				DIRMODE=true
   2661   1.1  christos 				SRC_ARG="${OPTARG}"
   2662   1.1  christos 				if [ -f "${OPTARG}/etc/Makefile" ]; then
   2663   1.1  christos 					SOURCEMODE=true
   2664   1.1  christos 				fi
   2665   1.1  christos 			else
   2666   1.1  christos 				err 2 "Invalid argument for -s option"
   2667   1.1  christos 			fi
   2668   1.1  christos 			;;
   2669   1.1  christos 		x)
   2670   1.1  christos 			if [ -d "${OPTARG}" ]; then
   2671   1.1  christos 				# arg refers to a directory.
   2672   1.1  christos 				XSRC_DIR="${OPTARG}"
   2673   1.1  christos 				XSRC_DIR_FIX="-x ${OPTARG} "
   2674   1.1  christos 			else
   2675   1.1  christos 				err 2 "Not a directory for -x option"
   2676   1.1  christos 			fi
   2677   1.1  christos 			;;
   2678   1.1  christos 		*)
   2679   1.1  christos 			usage
   2680   1.1  christos 			;;
   2681   1.1  christos 		esac
   2682   1.1  christos 	done
   2683   1.1  christos 	shift $((${OPTIND} - 1))
   2684  1.43     lukem 	if [ $# -eq 0 ] ; then
   2685  1.43     lukem 		warn "Missing operation"
   2686  1.43     lukem 		usage
   2687  1.43     lukem 	fi
   2688  1.45     lukem 	op="$1"
   2689  1.45     lukem 	shift
   2690   1.1  christos 
   2691   1.1  christos 	if [ "$N_SRC_ARGS" -gt 1 ] && $DIRMODE; then
   2692   1.1  christos 		err 2 "Multiple -s args are allowed only with tgz files"
   2693   1.1  christos 	fi
   2694   1.1  christos 	if [ "$N_SRC_ARGS" -eq 0 ]; then
   2695   1.1  christos 		# The default SRC_ARG was set elsewhere
   2696   1.1  christos 		DIRMODE=true
   2697   1.1  christos 		SOURCEMODE=true
   2698   1.1  christos 		SRC_ARGLIST="-s $(shell_quote "${SRC_ARG}")"
   2699   1.1  christos 	fi
   2700   1.1  christos 
   2701  1.45     lukem 		# Validate 'diff' first, as it becomes 'check'
   2702  1.45     lukem 		#
   2703  1.45     lukem 	case "${op}" in
   2704  1.45     lukem 
   2705  1.45     lukem 	diff)
   2706  1.45     lukem 		op=check
   2707  1.45     lukem 		DIFF_STYLE=n			# default style is RCS
   2708  1.45     lukem 		OPTIND=1
   2709  1.45     lukem 		while getopts bcenpuw ch; do
   2710  1.45     lukem 			case "${ch}" in
   2711  1.45     lukem 			c|e|n|u)
   2712  1.45     lukem 				if [ "${DIFF_STYLE}" != "n" -a \
   2713  1.45     lukem 				    "${DIFF_STYLE}" != "${ch}" ]; then
   2714  1.45     lukem 					err 2 "diff: conflicting output style: ${ch}"
   2715  1.45     lukem 				fi
   2716  1.45     lukem 				DIFF_STYLE="${ch}"
   2717  1.45     lukem 				;;
   2718  1.45     lukem 			b|p|w)
   2719  1.45     lukem 				DIFF_OPT="${DIFF_OPT} -${ch}"
   2720  1.45     lukem 				;;
   2721  1.45     lukem 			*)
   2722  1.45     lukem 				err 2 "diff: unknown option"
   2723  1.45     lukem 				;;
   2724  1.45     lukem 			esac
   2725  1.45     lukem 		done
   2726  1.45     lukem 		shift $((${OPTIND} - 1))
   2727  1.45     lukem 		;;
   2728  1.45     lukem 
   2729  1.45     lukem 	esac
   2730  1.45     lukem 
   2731  1.45     lukem 		# Validate operation and items.
   2732  1.45     lukem 		#
   2733  1.45     lukem 	case "${op}" in
   2734  1.45     lukem 
   2735  1.45     lukem 	check|fix)
   2736  1.45     lukem 		ITEMS="$*"
   2737  1.45     lukem 		: ${ITEMS:="${defaultitems}"}
   2738  1.45     lukem 
   2739  1.45     lukem 		# ensure that all supplied items are valid
   2740  1.45     lukem 		#
   2741  1.45     lukem 		for i in ${ITEMS}; do
   2742  1.45     lukem 			eval desc=\"\${desc_${i}}\"
   2743  1.45     lukem 			[ -n "${desc}" ] || err 2 "Unsupported ${op} '"${i}"'"
   2744  1.45     lukem 		done
   2745  1.45     lukem 		;;
   2746  1.45     lukem 
   2747  1.45     lukem 	help|usage)
   2748  1.45     lukem 		help
   2749  1.45     lukem 		return	# no further processing or validation
   2750  1.45     lukem 		;;
   2751  1.45     lukem 
   2752  1.45     lukem 	list)
   2753  1.45     lukem 		# processed below
   2754  1.45     lukem 		;;
   2755  1.45     lukem 
   2756  1.45     lukem 	*)
   2757  1.45     lukem 		warn "Unknown operation '"${op}"'"
   2758  1.45     lukem 		usage
   2759  1.45     lukem 		;;
   2760  1.45     lukem 
   2761  1.45     lukem 	esac
   2762  1.45     lukem 
   2763   1.1  christos 	#
   2764   1.1  christos 	# If '-s' arg or args specified tgz files, extract them
   2765   1.1  christos 	# to a scratch directory.
   2766   1.1  christos 	#
   2767   1.1  christos 	if $TGZMODE; then
   2768   1.1  christos 		ETCTGZDIR="${SCRATCHDIR}/etc.tgz"
   2769   1.1  christos 		echo "Note: Creating temporary directory ${ETCTGZDIR}"
   2770   1.1  christos 		if ! mkdir "${ETCTGZDIR}"; then
   2771   1.1  christos 			err 2 "Can't create ${ETCTGZDIR}"
   2772   1.1  christos 		fi
   2773   1.1  christos 		( # subshell to localise changes to "$@"
   2774   1.1  christos 			eval "set -- ${TGZLIST}"
   2775   1.1  christos 			for tgz in "$@"; do
   2776   1.1  christos 				echo "Note: Extracting files from ${tgz}"
   2777   1.1  christos 				cat "${tgz}" | (
   2778   1.1  christos 					cd "${ETCTGZDIR}" &&
   2779   1.1  christos 					tar -zxf -
   2780   1.1  christos 				) || err 2 "Can't extract ${tgz}"
   2781   1.1  christos 			done
   2782   1.1  christos 		)
   2783   1.1  christos 		SRC_DIR="${ETCTGZDIR}"
   2784   1.1  christos 	else
   2785   1.1  christos 		SRC_DIR="${SRC_ARG}"
   2786   1.1  christos 	fi
   2787   1.1  christos 
   2788   1.1  christos 	[ -d "${SRC_DIR}" ]	|| err 2 "${SRC_DIR} is not a directory"
   2789   1.1  christos 	[ -d "${DEST_DIR}" ]	|| err 2 "${DEST_DIR} is not a directory"
   2790   1.1  christos 	[ -n "${MACHINE}" ]	|| err 2 "\${MACHINE} is not defined"
   2791   1.1  christos 	[ -n "${MACHINE_ARCH}" ] || err 2 "\${MACHINE_ARCH} is not defined"
   2792   1.1  christos 	if ! $SOURCEMODE && ! [ -f "${SRC_DIR}/etc/mtree/set.etc" ]; then
   2793   1.1  christos 		err 2 "Files from the etc.tgz set are missing"
   2794   1.1  christos 	fi
   2795   1.1  christos 
   2796   1.1  christos 		# If directories are /, clear them, so various messages
   2797   1.1  christos 		# don't have leading "//".   However, this requires
   2798   1.1  christos 		# the use of ${foo:-/} to display the variables.
   2799   1.1  christos 		#
   2800   1.1  christos 	[ "${SRC_DIR}" = "/" ]	&& SRC_DIR=""
   2801   1.1  christos 	[ "${DEST_DIR}" = "/" ]	&& DEST_DIR=""
   2802   1.1  christos 
   2803   1.1  christos 	detect_x11
   2804   1.1  christos 
   2805  1.45     lukem 		# Perform operation.
   2806  1.45     lukem 		#
   2807   1.1  christos 	case "${op}" in
   2808   1.1  christos 
   2809   1.1  christos 	check|fix)
   2810  1.45     lukem 		[ -n "${ITEMS}" ] || err 2 "${op}: missing items"
   2811   1.1  christos 
   2812   1.1  christos 		echo "Source directory: ${SRC_DIR:-/}"
   2813   1.1  christos 		if $TGZMODE; then
   2814   1.1  christos 			echo " (extracted from: ${SRC_ARG})"
   2815   1.1  christos 		fi
   2816   1.1  christos 		echo "Target directory: ${DEST_DIR:-/}"
   2817   1.1  christos 		items_passed=
   2818   1.1  christos 		items_failed=
   2819  1.45     lukem 		for i in ${ITEMS}; do
   2820   1.1  christos 			echo "${i} ${op}:"
   2821   1.1  christos 			( eval do_${i} ${op} )
   2822   1.1  christos 			if [ $? -eq 0 ]; then
   2823   1.1  christos 				items_passed="${items_passed} ${i}"
   2824   1.1  christos 			else
   2825   1.1  christos 				items_failed="${items_failed} ${i}"
   2826   1.1  christos 			fi
   2827   1.1  christos 		done
   2828   1.1  christos 
   2829   1.1  christos 		if [ "${op}" = "check" ]; then
   2830   1.1  christos 			plural="checks"
   2831   1.1  christos 		else
   2832   1.1  christos 			plural="fixes"
   2833   1.1  christos 		fi
   2834   1.1  christos 
   2835   1.1  christos 		echo "${PROGNAME} ${plural} passed:${items_passed}"
   2836   1.1  christos 		echo "${PROGNAME} ${plural} failed:${items_failed}"
   2837   1.1  christos 		if [ -n "${items_failed}" ]; then
   2838   1.1  christos 		    exitstatus=1;
   2839   1.1  christos 		    if [ "${op}" = "check" ]; then
   2840   1.1  christos 			[ "$MACHINE" = "$(uname -m)" ] && m= || m=" -m $MACHINE"
   2841   1.1  christos 			cat <<_Fix_me_
   2842   1.1  christos To fix, run:
   2843   1.1  christos     ${HOST_SH} ${0} ${SRC_ARGLIST} ${XSRC_DIR_FIX}-d ${DEST_DIR:-/}$m fix${items_failed}
   2844   1.1  christos Note that this may overwrite local changes.
   2845   1.1  christos _Fix_me_
   2846   1.1  christos 		    fi
   2847   1.1  christos 		fi
   2848  1.45     lukem 		;;
   2849   1.1  christos 
   2850  1.45     lukem 	list)
   2851  1.45     lukem 		echo "Source directory: ${SRC_DIR:-/}"
   2852  1.45     lukem 		echo "Target directory: ${DEST_DIR:-/}"
   2853  1.45     lukem 		if $TGZMODE; then
   2854  1.45     lukem 			echo " (extracted from: ${SRC_ARG})"
   2855  1.45     lukem 		fi
   2856  1.45     lukem 		list
   2857   1.1  christos 		;;
   2858   1.1  christos 
   2859   1.1  christos 	*)
   2860  1.45     lukem 			# diff, help, usage handled during operation validation
   2861  1.45     lukem 		err 3 "Unimplemented operation '"${op}"'"
   2862   1.1  christos 		;;
   2863   1.1  christos 
   2864   1.1  christos 	esac
   2865   1.1  christos }
   2866   1.1  christos 
   2867   1.2  christos if [ -n "$POSTINSTALL_FUNCTION" ]; then
   2868   1.2  christos 	eval "$POSTINSTALL_FUNCTION"
   2869   1.2  christos 	exit 0
   2870   1.2  christos fi
   2871   1.2  christos 
   2872   1.1  christos # defaults
   2873   1.1  christos #
   2874   1.1  christos PROGNAME="${0##*/}"
   2875   1.1  christos SRC_ARG="/usr/src"
   2876   1.1  christos DEST_DIR="/"
   2877   1.1  christos : ${MACHINE:="$( uname -m )"}	# assume native build if $MACHINE is not set
   2878   1.1  christos : ${MACHINE_ARCH:="$( uname -p )"}# assume native build if not set
   2879   1.1  christos 
   2880   1.1  christos DIFF_STYLE=
   2881  1.45     lukem DIFF_OPT=
   2882   1.1  christos NOT_FIXED=" (FIX MANUALLY)"
   2883   1.1  christos SCRATCHDIR="$( mkdtemp )" || err 2 "Can't create scratch directory"
   2884   1.1  christos trap "/bin/rm -rf \"\${SCRATCHDIR}\" ; exit 0" 1 2 3 15	# HUP INT QUIT TERM
   2885   1.1  christos 
   2886   1.1  christos umask 022
   2887   1.1  christos exec 3>/dev/null
   2888   1.1  christos exec 4>/dev/null
   2889   1.1  christos exitstatus=0
   2890   1.1  christos 
   2891   1.1  christos main "$@"
   2892   1.1  christos /bin/rm -rf "${SCRATCHDIR}"
   2893   1.1  christos exit $exitstatus
   2894