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