rc revision 108200
1#!/bin/sh
2#
3# Copyright (c) 2000  The FreeBSD Project
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27#	@(#)rc	5.27 (Berkeley) 6/5/91
28# $FreeBSD: head/etc/rc 108200 2002-12-23 07:09:44Z dillon $
29#
30
31# System startup script run by init on autoboot
32# or after single-user.
33# Output and error are redirected to console by init,
34# and the console is the controlling terminal.
35
36# Note that almost all of the user-configurable behavior is no longer in
37# this file, but rather in /etc/defaults/rc.conf.  Please check that file
38# first before contemplating any changes here.  If you do need to change
39# this file for some reason, we would like to know about it.
40
41stty status '^T'
42
43# Set shell to ignore SIGINT (2), but not children;
44# shell catches SIGQUIT (3) and returns to single user after fsck.
45#
46trap : 2
47trap : 3	# shouldn't be needed
48
49HOME=/
50PATH=/sbin:/bin:/usr/sbin:/usr/bin
51export HOME PATH
52
53# check_rcng() is run in a subshell solely to determine the
54# RCNG mode.  We do not want to pollute our variable space
55# too soon so the procedure must be run in a subshell.  An
56# exit code of 3 indicates RCNG is enabled.
57#
58check_rcng()
59{
60	if [ -r /etc/defaults/rc.conf ]; then
61		. /etc/defaults/rc.conf
62		source_rc_confs
63	elif [ -r /etc/rc.conf ]; then
64		. /etc/rc.conf
65	fi
66
67	# Diskless setups have to depend on a different mechanism since
68	# their config files haven't been retargeted yet.
69	#
70	[ -e /.rcng_yes ] && rc_ng="YES"
71	case ${rc_ng} in
72	[Yy][Ee][Ss])
73		exit 3
74		;;
75	*)
76		exit 0
77		;;
78	esac
79}
80
81( check_rcng )
82if [ $? = 3 ]; then
83    rc_ng=YES
84else
85    rc_ng=NO
86fi
87
88case ${rc_ng} in
89YES)
90	. /etc/rc.subr
91
92	# Note: the system configuration files are loaded as part of
93	# the RCNG system (rc.d/rccond).  Do not load them here as it may
94	# interfere with diskless booting.
95	#
96	if [ "$1" = autoboot ]; then
97		autoboot=yes
98		_boot="faststart"
99		rc_fast=yes        # run_rc_command(): do fast booting
100	else
101		autoboot=no
102		_boot="start"
103	fi
104
105	os=`eval ${CMD_OSTYPE}`
106	files=`rcorder -k ${os} -s nostart /etc/rc.d/* 2>/dev/null`
107
108	for _rc_elem in ${files}; do
109		run_rc_script ${_rc_elem} ${_boot}
110	done
111
112	echo ''
113	date
114	exit 0
115	;;
116*)
117	# fall-through to the old rc scripts
118	;;
119esac
120
121bootmode=$1
122
123# BOOTP diskless boot.  We have to run the rc file early in order to
124# retarget various config files.
125#
126if [ -r /etc/rc.diskless1 ]; then
127	dlv=`/sbin/sysctl -n vfs.nfs.diskless_valid 2> /dev/null`
128	if [ ${dlv:=0} != 0 ]; then
129		. /etc/rc.diskless1
130	fi
131fi
132
133# If there is a global system configuration file, suck it in.
134#
135if [ -r /etc/defaults/rc.conf ]; then
136	. /etc/defaults/rc.conf
137	source_rc_confs
138elif [ -r /etc/rc.conf ]; then
139	. /etc/rc.conf
140fi
141
142# XXX - Deprecated variable name support
143#	for rpcbind and ntpd
144#
145[ -n "$portmap_enable" ] && rpcbind_enable="$portmap_enable"
146[ -n "$portmap_program" ] && rpcbind_program="$portmap_program"
147[ -n "$portmap_flags" ] && rpcbind_flags="$portmap_flags"
148[ -n "$single_mountd_enable" ] && mountd_enable="$single_mountd_enable"
149[ -n "$xntpd_enable" ] && ntpd_enable="$xntpd_enable"
150[ -n "$xntpd_program" ] && ntpd_program="$xntpd_program"
151[ -n "$xntpd_flags" ] && ntpd_flags="$xntpd_flags"
152
153feed_dev_random() {
154	if [ -f "${1}" -a -r "${1}" -a -s "${1}" ]; then
155#		echo "Using ${1} as an entropy file"
156		cat "${1}" | dd of=/dev/random bs=8k 2>/dev/null
157	fi
158}
159
160chkdepend() {
161	svc=$1
162	svc_var=$2
163	dep=$3
164	dep_var=$4
165
166	eval svc_val=\${$svc_var}
167	eval dep_val=\${$dep_var}
168
169	case ${svc_val} in
170	[Yy][Ee][Ss])
171		case ${dep_val} in
172		[Yy][Ee][Ss])
173			;;
174		*)
175			eval ${dep_var}="YES"
176			echo "DEPENDENCY NOTE: ${dep} will be enabled" \
177			"to support ${svc}"
178			;;
179		esac
180		;;
181	esac
182}
183
184chkdepend amd amd_enable        rpcbind rpcbind_enable
185chkdepend amd amd_enable        NFS nfs_client_enable
186chkdepend NFS nfs_server_enable rpcbind rpcbind_enable
187chkdepend NIS nis_server_enable rpcbind rpcbind_enable
188chkdepend NIS nis_client_enable rpcbind rpcbind_enable
189
190# Enable dumpdev early so that a crash during the boot process can be caught.
191#
192case ${dumpdev} in
193[Nn][Oo] | '')
194	dumpdev='NO'
195	;;
196*)
197	/sbin/dumpon -v ${dumpdev}
198	;;
199esac
200
201# Enable harvesting of entropy via devices.  The sooner this happens the
202# better so that we can take advantage of the boot process.
203#
204echo -n 'Entropy harvesting:'
205
206case ${harvest_interrupt} in
207[Nn][Oo])
208	;;
209*)
210	if [ -w /dev/random ]; then
211		/sbin/sysctl kern.random.sys.harvest.interrupt=1 >/dev/null
212		echo -n ' interrupts'
213	fi
214	;;
215esac
216
217case ${harvest_ethernet} in
218[Nn][Oo])
219	;;
220*)
221	if [ -w /dev/random ]; then
222		/sbin/sysctl kern.random.sys.harvest.ethernet=1 >/dev/null
223		echo -n ' ethernet'
224	fi
225	;;
226esac
227
228case ${harvest_p_to_p} in
229[Nn][Oo])
230	;;
231*)
232	if [ -w /dev/random ]; then
233	/sbin/sysctl kern.random.sys.harvest.point_to_point=1 >/dev/null
234		echo -n ' point_to_point'
235	fi
236	;;
237esac
238
239echo '.'
240
241# First pass at reseeding /dev/random.
242#
243case ${entropy_file} in
244[Nn][Oo] | '')
245	;;
246*)
247	if [ -w /dev/random ]; then
248		feed_dev_random "${entropy_file}"
249	fi
250	;;
251esac
252
253# XXX temporary until we can get the entropy
254# harvesting rate up
255# Entropy below is not great,
256# but better than nothing.
257( ps -fauxww; sysctl -a; date; df -ib; dmesg; ps -fauxww; ) \
258    | dd of=/dev/random bs=8k 2>/dev/null
259cat /bin/ls | dd of=/dev/random bs=8k 2>/dev/null
260
261# Configure ccd devices.
262#
263if [ -r /etc/ccd.conf ]; then
264	ccdconfig -C
265fi
266
267case ${start_vinum} in
268[Yy][Ee][Ss])
269	vinum start
270	;;
271esac
272
273swapon -a
274
275# Last chance to do things before potentially waiting for
276# operator to do fsck related tasks
277if [ -r /etc/rc.early ]; then
278	. /etc/rc.early
279fi
280
281case ${bootmode} in
282autoboot)
283	echo 'Automatic boot in progress...'
284	case ${background_fsck} in
285	[Yy][Ee][Ss])
286		fsck -F -p
287		;;
288	*)
289		fsck -p
290		;;
291	esac
292	case $? in
293	0)
294		;;
295	2)
296		exit 1
297		;;
298	4)
299		reboot
300		echo 'Reboot failed... help!'
301		exit 1
302		;;
303	8)
304		case ${fsck_y_enable} in
305		[Yy][Ee][Ss])
306			echo 'File system preen failed, trying fsck -y . . .'
307			fsck -y
308			case $? in
309			0)
310				;;
311			*)
312			echo 'Automatic filesystem check failed . . . help!'
313				exit 1
314				;;
315			esac
316			;;
317		*)
318			echo 'Automatic filesystem check failed . . . help!'
319			exit 1
320			;;
321		esac
322		;;
323	12)
324		echo 'Reboot interrupted'
325		exit 1
326		;;
327	130)
328		# interrupt before catcher installed
329		exit 1
330		;;
331	*)
332		echo 'Unknown error in reboot'
333		exit 1
334		;;
335	esac
336	;;
337*)
338	echo 'Skipping disk checks ...'
339	;;
340esac
341
342set -T
343trap "echo 'Reboot interrupted'; exit 1" 3
344
345# root normally must be read/write, but if this is a BOOTP NFS
346# diskless boot it does not have to be.
347#
348case ${root_rw_mount} in
349[Nn][Oo] | '')
350	;;
351*)
352	if ! mount -u -o rw / ; then
353		echo 'Mounting root filesystem rw failed, startup aborted'
354		exit 1
355	fi
356	;;
357esac
358
359umount -a >/dev/null 2>&1
360
361# Set up the list of network filesystem types for which mounting should be
362# delayed until after network initialization.
363networkfs_types='nfs:NFS smbfs:SMB portalfs:PORTAL'
364case ${extra_netfs_types} in
365[Nn][Oo])
366	;;
367*)
368	networkfs_types="${networkfs_types} ${extra_netfs_types}"
369	;;
370esac
371
372# Mount everything except nfs filesystems.
373mount_excludes='no'
374for i in ${networkfs_types}; do
375	fstype=${i%:*}
376	mount_excludes="${mount_excludes}${fstype},"
377done
378mount_excludes=${mount_excludes%,}
379mount -a -t ${mount_excludes}
380
381case $? in
3820)
383	;;
384*)
385	echo 'Mounting /etc/fstab filesystems failed, startup aborted'
386	exit 1
387	;;
388esac
389
390# Run custom disk mounting function here
391#
392if [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then
393		sh ${diskless_mount}
394fi
395
396# If we booted a special kernel remove the record so we will boot
397# the default kernel next time
398rm -f /boot/nextboot.conf
399
400# Reseed /dev/random with previously stored entropy.
401case ${entropy_dir} in
402[Nn][Oo])
403	;;
404*)
405	entropy_dir=${entropy_dir:-/var/db/entropy}
406	if [ -d "${entropy_dir}" ]; then
407		if [ -w /dev/random ]; then
408			for seedfile in ${entropy_dir}/*; do
409				feed_dev_random "${seedfile}"
410			done
411		fi
412	fi
413	;;
414esac
415
416case ${entropy_file} in
417[Nn][Oo] | '')
418	;;
419*)
420	if [ -w /dev/random ]; then
421		feed_dev_random "${entropy_file}"
422	fi
423	;;
424esac
425
426adjkerntz -i
427
428purgedir() {
429	local dir file
430
431	if [ $# -eq 0 ]; then
432		purgedir .
433	else
434		for dir
435		do
436		(
437			cd "$dir" && for file in .* *
438			do
439				[ ."$file" = .. -o ."$file" = ... ] && continue
440				if [ -d "$file" -a ! -L "$file" ]
441				then
442					purgedir "$file"
443				else
444					rm -f -- "$file"
445				fi
446			done
447		)
448		done
449	fi
450}
451
452clean_var() {
453	if [ -d /var/run -a ! -f /var/run/clean_var ]; then
454		purgedir /var/run
455		# Keep a copy of the boot messages around
456		dmesg >/var/run/dmesg.boot
457		# And an initial utmp file
458		(cd /var/run && cp /dev/null utmp && chmod 644 utmp;)
459		>/var/run/clean_var
460	fi
461	if [ -d /var/spool/lock -a ! -f /var/spool/lock/clean_var ]; then
462		purgedir /var/spool/lock
463		>/var/spool/lock/clean_var
464	fi
465	rm -rf /var/spool/uucp/.Temp/*
466}
467
468# network_pass1() *may* end up writing stuff to /var - we don't want to
469# remove it immediately afterwards - *nor* do we want to fail to clean
470# an NFS-mounted /var.
471rm -f /var/run/clean_var /var/spool/lock/clean_var
472clean_var
473
474# Add additional swapfile, if configured.
475#
476case ${swapfile} in
477[Nn][Oo] | '')
478	;;
479*)
480	if [ -w "${swapfile}" -a -c /dev/mdctl ]; then
481		echo "Adding ${swapfile} as additional swap"
482		mdev=`mdconfig -a -t vnode -f ${swapfile}` && swapon /dev/${mdev}
483	fi
484	;;
485esac
486
487# Early pass to set the variables we can
488#
489if [ -r /etc/rc.sysctl ]; then
490	sh /etc/rc.sysctl first
491fi
492
493# Configure serial devices
494#
495if [ -r /etc/rc.serial ]; then
496	. /etc/rc.serial
497fi
498
499# Start up PC-card configuration
500#
501if [ -r /etc/rc.pccard ]; then
502	. /etc/rc.pccard
503fi
504
505# Start up the initial network configuration.
506#
507if [ -r /etc/rc.network ]; then
508	. /etc/rc.network	# We only need to do this once.
509	network_pass1
510fi
511
512case ${ipv6_enable} in
513[Yy][Ee][Ss])
514	if [ -r /etc/rc.network6 ]; then
515		. /etc/rc.network6	# We only need to do this once also.
516		network6_pass1
517	fi
518	;;
519esac
520
521# Mount NFS filesystems if present in /etc/fstab
522#
523# XXX When the vfsload() issues with nfsclient support and related sysctls
524# have been resolved, this block can be removed, and the condition that
525# skips nfs in the following block (for "other network filesystems") can
526# be removed.
527case "`mount -d -a -t nfs 2> /dev/null`" in
528*mount_nfs*)
529	# Handle absent nfs client support
530	nfsclient_in_kernel=0
531	if sysctl vfs.nfs >/dev/null 2>&1; then
532		nfsclient_in_kernel=1
533	else
534		kldload nfsclient && nfsclient_in_kernel=1
535	fi
536
537	case ${nfsclient_in_kernel} in
538	1)
539		echo -n 'Mounting NFS filesystem:'
540		mount -a -t nfs
541		echo '.'
542		;;
543	*)
544		echo 'Warning: nfs mount requested, but no nfs client in kernel'
545		;;
546	esac
547	;;
548esac
549
550# Mount other network filesystems if present in /etc/fstab
551for i in ${networkfs_types}; do
552	fstype=${i%:*}
553	fsdecr=${i#*:}
554
555	if [ "${fstype}" = "nfs" ]; then
556		continue
557	fi
558	case "`mount -d -a -t ${fstype}`" in
559	*mount_${fstype}*)
560		echo -n "Mounting ${fsdecr} filesystems:"
561		mount -a -t ${fstype}
562		echo '.'
563		;;
564	esac
565done
566
567# Whack the pty perms back into shape.
568#
569if ls /dev/tty[pqrsPQRS]* > /dev/null 2>&1; then
570	chflags 0 /dev/tty[pqrsPQRS]*
571	chmod 666 /dev/tty[pqrsPQRS]*
572	chown root:wheel /dev/tty[pqrsPQRS]*
573fi
574
575# Clean up left-over files
576#
577clean_var			# If it hasn't already been done
578rm /var/run/clean_var /var/spool/lock/clean_var
579
580# Clearing /tmp at boot-time seems to have a long tradition.  It doesn't
581# help in any way for long-living systems, and it might accidentally
582# clobber files you would rather like to have preserved after a crash
583# (if not using mfs /tmp anyway).
584#
585# See also the example of another cleanup policy in /etc/periodic/daily.
586#
587case ${clear_tmp_enable} in
588[Yy][Ee][Ss])
589	echo -n 'Clearing /tmp:'
590	# prune quickly with one rm, then use find to clean up /tmp/[lq]*
591	# (not needed with mfs /tmp, but doesn't hurt there...)
592	(cd /tmp && rm -rf [a-km-pr-zA-Z]* &&
593		find -d . ! -name . ! -name lost+found ! -name quota.user \
594		! -name quota.group -exec rm -rf -- {} \;)
595	echo '.'
596	;;
597esac
598
599# Remove X lock files, since they will prevent you from restarting X11
600# after a system crash.
601#
602rm -f /tmp/.X*-lock
603rm -fr /tmp/.X11-unix
604mkdir -m 1777 /tmp/.X11-unix
605
606# Snapshot any kernel -c changes back to disk here <someday>.
607# This has changed with ELF and /kernel.config.
608
609# Load LOMAC(4) security if wanted.
610case ${lomac_enable} in
611[Yy][Ee][Ss])
612	kldload mac_lomac >/dev/null 2>&1
613	;;
614esac
615
616echo -n 'Additional daemons:'
617
618# Start system logging and name service.  Named needs to start before syslogd
619# if you don't have a /etc/resolv.conf.
620#
621case ${syslogd_enable} in
622[Yy][Ee][Ss])
623	# Transitional symlink (for the next couple of years :) until all
624	# binaries have had a chance to move towards /var/run/log.
625	if [ ! -L /dev/log ]; then
626		# might complain for r/o root f/s
627		ln -sf /var/run/log /dev/log
628	fi
629
630	rm -f /var/run/log
631	echo -n ' syslogd';
632	${syslogd_program:-/usr/sbin/syslogd} ${syslogd_flags}
633	;;
634esac
635
636echo '.'
637
638# Build device name databases if we are not using DEVFS
639#
640if sysctl vfs.devfs.generation > /dev/null 2>&1 ; then
641	rm -f /var/run/dev.db
642else
643	dev_mkdb
644fi
645
646# $dumpdir should be a directory or a symbolic link
647# to the crash directory if core dumps are to be saved.
648#
649if [ "${dumpdev}" != 'NO' ]; then
650	case ${dumpdir} in
651	'')
652		dumpdir='/var/crash'
653		;;
654	[Nn][Oo])
655		dumpdir='NO'
656		;;
657	esac
658
659	if [ "${dumpdir}" != 'NO' ]; then
660		echo -n 'Checking for core dump: '
661		/sbin/savecore ${savecore_flags} "${dumpdir}"
662	fi
663fi
664
665if [ -n "${network_pass1_done}" ]; then
666	network_pass2
667fi
668
669# Enable/Check the quotas (must be after ypbind if using NIS)
670#
671case ${enable_quotas} in
672[Yy][Ee][Ss])
673	case ${check_quotas} in
674	[Yy][Ee][Ss])
675		echo -n 'Checking quotas:'
676		quotacheck -a
677		echo ' done.'
678		;;
679	esac
680
681	echo -n 'Enabling quotas:'
682	quotaon -a
683	echo ' done.'
684	;;
685esac
686
687if [ -n "${network_pass2_done}" ]; then
688	network_pass3
689fi
690
691# Check the password temp/lock file
692#
693if [ -e /etc/ptmp ]; then
694	logger -s -p auth.err \
695	"password file may be incorrect -- /etc/ptmp exists"
696fi
697
698case ${accounting_enable} in
699[Yy][Ee][Ss])
700	if [ -d /var/account ]; then
701		echo 'Turning on accounting:'
702		if [ ! -e /var/account/acct ]; then
703			touch /var/account/acct
704		fi
705		accton /var/account/acct
706	fi
707	;;
708esac
709
710# Make shared lib searching a little faster.  Leave /usr/lib first if you
711# add your own entries or you may come to grief.
712#
713ldconfig="/sbin/ldconfig"
714case ${ldconfig_insecure} in
715[Yy][Ee][Ss])
716	ldconfig="${ldconfig} -i"
717	;;
718esac
719if [ -x /sbin/ldconfig ]; then
720	_LDC=/usr/lib
721	for i in ${ldconfig_paths}; do
722		if [ -d "${i}" ]; then
723			_LDC="${_LDC} ${i}"
724		fi
725	done
726	echo 'ELF ldconfig path:' ${_LDC}
727	${ldconfig} ${_LDC}
728
729	# Legacy aout support for i386 only
730	case `sysctl -n hw.machine_arch` in
731	i386)
732		# Default the a.out ldconfig path.
733		: ${ldconfig_paths_aout=${ldconfig_paths}}
734		_LDC=/usr/lib/aout
735		for i in ${ldconfig_paths_aout}; do
736			if [ -d "${i}" ]; then
737				_LDC="${_LDC} ${i}"
738			fi
739		done
740		echo 'a.out ldconfig path:' ${_LDC}
741		${ldconfig} -aout ${_LDC}
742		;;
743	esac
744fi
745
746# Now start up miscellaneous daemons that don't belong anywhere else
747#
748echo -n 'Starting standard daemons:'
749case ${inetd_enable} in
750[Nn][Oo])
751	;;
752*)
753	echo -n ' inetd'; ${inetd_program:-/usr/sbin/inetd} ${inetd_flags}
754	;;
755esac
756
757case ${cron_enable} in
758[Nn][Oo])
759	;;
760*)
761	echo -n ' cron';	${cron_program:-/usr/sbin/cron} ${cron_flags}
762	;;
763esac
764
765case ${lpd_enable} in
766[Yy][Ee][Ss])
767	echo -n ' printer';	${lpd_program:-/usr/sbin/lpd} ${lpd_flags}
768	;;
769esac
770
771case ${sshd_enable} in
772[Yy][Ee][Ss])
773	if [ -x ${sshd_program:-/usr/sbin/sshd} ]; then
774		echo -n ' sshd';
775		${sshd_program:-/usr/sbin/sshd} ${sshd_flags}
776	fi
777	;;
778esac
779
780case ${usbd_enable} in
781[Yy][Ee][Ss])
782	echo -n ' usbd';	/usr/sbin/usbd ${usbd_flags}
783	;;
784esac
785
786case ${mta_start_script} in
787/*)
788	if [ -r ${mta_start_script} ]; then
789		sh ${mta_start_script}
790	fi
791	;;
792esac
793
794echo '.'
795
796# Recover vi editor files.
797find /var/tmp/vi.recover ! -type f -a ! -type d -delete
798vibackup=`echo /var/tmp/vi.recover/vi.*`
799if [ "${vibackup}" != '/var/tmp/vi.recover/vi.*' ]; then
800	echo -n 'Recovering vi editor sessions:'
801	for i in /var/tmp/vi.recover/vi.*; do
802		# Only test files that are readable.
803		if [ ! -r "${i}" ]; then
804			continue
805		fi
806
807		# Unmodified nvi editor backup files either have the
808		# execute bit set or are zero length.  Delete them.
809		if [ -x "${i}" -o ! -s "${i}" ]; then
810			rm -f "${i}"
811		fi
812	done
813
814	# It is possible to get incomplete recovery files, if the editor
815	# crashes at the right time.
816	virecovery=`echo /var/tmp/vi.recover/recover.*`
817	if [ "${virecovery}" != "/var/tmp/vi.recover/recover.*" ]; then
818		for i in /var/tmp/vi.recover/recover.*; do
819			# Only test files that are readable.
820			if [ ! -r "${i}" ]; then
821				continue
822			fi
823
824			# Delete any recovery files that are zero length,
825			# corrupted, or that have no corresponding backup file.
826			# Else send mail to the user.
827			recfile=`awk '/^X-vi-recover-path:/{print $2}' < "${i}"`
828			if [ -n "${recfile}" -a -s "${recfile}" ]; then
829				sendmail -t < "${i}"
830			else
831				rm -f "${i}"
832			fi
833		done
834	fi
835	echo '.'
836fi
837
838# Make a bounds file for msgs(1) if there isn't one already
839#
840if [ -d /var/msgs -a ! -f /var/msgs/bounds -a ! -L /var/msgs/bounds ]; then
841	echo 0 > /var/msgs/bounds
842fi
843
844case ${update_motd} in
845[Nn][Oo] | '')
846	;;
847*)
848	if T=`mktemp /tmp/_motd.XXXXXX`; then
849		uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' > ${T}
850		awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' < /etc/motd >> ${T}
851		cmp -s ${T} /etc/motd || {
852			cp ${T} /etc/motd
853			chmod 644 /etc/motd
854		}
855		rm -f ${T}
856	fi
857	;;
858esac
859
860# Run rc.devfs if readable to customize devfs
861#
862if [ -r /etc/rc.devfs ]; then
863	sh /etc/rc.devfs
864fi
865
866# Configure implementation specific stuff
867#
868arch=`uname -p`
869if [ -r /etc/rc.${arch} ]; then
870	. /etc/rc.${arch}
871fi
872
873# Configure the system console
874#
875if [ -r /etc/rc.syscons ]; then
876	. /etc/rc.syscons
877fi
878
879echo -n 'Additional ABI support:'
880
881# Load the SysV IPC API if requested.
882case ${sysvipc_enable} in
883[Yy][Ee][Ss])
884	echo -n ' sysvipc'
885	kldload sysvmsg >/dev/null 2>&1
886	kldload sysvsem >/dev/null 2>&1
887	kldload sysvshm >/dev/null 2>&1
888	;;
889esac
890
891# Start the Linux binary compatibility if requested.
892#
893case ${linux_enable} in
894[Yy][Ee][Ss])
895	echo -n ' linux'
896	if ! kldstat -v | grep -E 'linux(aout|elf)' > /dev/null; then
897		kldload linux > /dev/null 2>&1
898	fi
899	if [ -x /compat/linux/sbin/ldconfig ]; then
900		/compat/linux/sbin/ldconfig
901	fi
902	;;
903esac
904
905# Start the SysVR4 binary emulation if requested.
906#
907case ${svr4_enable} in
908[Yy][Ee][Ss])
909	echo -n ' svr4';	kldload svr4 > /dev/null 2>&1
910	;;
911esac
912
913echo '.'
914
915# Do traditional (but rather obsolete) rc.local file if it exists.  If you
916# use this file and want to make it programmatic, source /etc/defaults/rc.conf
917# in /etc/rc.local and add your custom variables to /etc/rc.conf, as
918# shown below.  Please do not put local extensions into /etc/rc itself.
919# Use /etc/rc.local
920#
921# ---- rc.local ----
922#	if [ -r /etc/defaults/rc.conf ]; then
923#		. /etc/defaults/rc.conf
924#		source_rc_confs
925#	elif [ -r /etc/rc.conf ]; then
926#		. /etc/rc.conf
927#	fi
928#
929#	... additional startup conditionals ...
930# ---- rc.local ----
931#
932if [ -r /etc/rc.local ]; then
933	echo -n 'Starting local daemons:'
934	sh /etc/rc.local
935	echo '.'
936fi
937
938# For each valid dir in $local_startup, search for init scripts matching *.sh
939#
940case ${local_startup} in
941[Nn][Oo] | '')
942	;;
943*)
944	echo -n 'Local package initialization:'
945	slist=""
946	if [ -z "${script_name_sep}" ]; then
947		script_name_sep=" "
948	fi
949	for dir in ${local_startup}; do
950		if [ -d "${dir}" ]; then
951			for script in ${dir}/*.sh; do
952				slist="${slist}${script_name_sep}${script}"
953			done
954		fi
955	done
956	script_save_sep="$IFS"
957	IFS="${script_name_sep}"
958	for script in ${slist}; do
959		if [ -x "${script}" ]; then
960			(set -T
961			trap 'exit 1' 2
962			${script} start)
963		elif [ -f "${script}" -o -L "${script}" ]; then
964			echo -n " (skipping ${script##*/}, not executable)"
965		fi
966	done
967	IFS="${script_save_sep}"
968	echo '.'
969	;;
970esac
971
972if [ -n "${network_pass3_done}" ]; then
973	network_pass4
974fi
975
976# Late pass to set variables we missed the first time
977#
978if [ -r /etc/rc.sysctl ]; then
979	sh /etc/rc.sysctl last
980fi
981
982# Raise kernel security level.  This should be done only after `fsck' has
983# repaired local filesystems if you want the securelevel to be greater than 1.
984#
985case ${kern_securelevel_enable} in
986[Yy][Ee][Ss])
987	if [ "${kern_securelevel}" -ge 0 ]; then
988		echo 'Raising kernel security level: '
989		sysctl kern.securelevel=${kern_securelevel}
990	fi
991	;;
992esac
993
994# Start background fsck checks if necessary
995case ${background_fsck} in
996[Yy][Ee][Ss])
997	bgfsck_msg='Starting background file system checks'
998	if [ ${background_fsck_delay:=0} -gt 0 ]; then
999		bgfsck_msg="${bgfsck_msg} in ${background_fsck_delay} seconds"
1000	fi
1001	echo "${bgfsck_msg}."
1002
1003	(sleep ${background_fsck_delay}; nice -4 fsck -B -p) 2>&1 | \
1004	    logger -p daemon.notice &
1005	;;
1006esac
1007
1008echo ''
1009
1010date
1011
1012exit 0
1013
1014