]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - etc/rc
Add libufs to dependencies.
[FreeBSD/FreeBSD.git] / etc / rc
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$
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
41 stty 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 #
46 trap : 2
47 trap : 3        # shouldn't be needed
48
49 HOME=/
50 PATH=/sbin:/bin:/usr/sbin:/usr/bin
51 export 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 #
58 check_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 )
82 if [ $? = 3 ]; then
83     rc_ng=YES
84 else
85     rc_ng=NO
86 fi
87
88 case ${rc_ng} in
89 YES)
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         ;;
119 esac
120
121 bootmode=$1
122
123 # BOOTP diskless boot.  We have to run the rc file early in order to
124 # retarget various config files.
125 #
126 if [ -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
131 fi
132
133 # If there is a global system configuration file, suck it in.
134 #
135 if [ -r /etc/defaults/rc.conf ]; then
136         . /etc/defaults/rc.conf
137         source_rc_confs
138 elif [ -r /etc/rc.conf ]; then
139         . /etc/rc.conf
140 fi
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
153 feed_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
160 chkdepend() {
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
184 chkdepend amd amd_enable        rpcbind rpcbind_enable
185 chkdepend amd amd_enable        NFS nfs_client_enable
186 chkdepend NFS nfs_server_enable rpcbind rpcbind_enable
187 chkdepend NIS nis_server_enable rpcbind rpcbind_enable
188 chkdepend NIS nis_client_enable rpcbind rpcbind_enable
189
190 # Enable dumpdev early so that a crash during the boot process can be caught.
191 #
192 case ${dumpdev} in
193 [Nn][Oo] | '')
194         dumpdev='NO'
195         ;;
196 *)
197         /sbin/dumpon -v ${dumpdev}
198         ;;
199 esac
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 #
204 echo -n 'Entropy harvesting:'
205
206 case ${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         ;;
215 esac
216
217 case ${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         ;;
226 esac
227
228 case ${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         ;;
237 esac
238
239 echo '.'
240
241 # First pass at reseeding /dev/random.
242 #
243 case ${entropy_file} in
244 [Nn][Oo] | '')
245         ;;
246 *)
247         if [ -w /dev/random ]; then
248                 feed_dev_random "${entropy_file}"
249         fi
250         ;;
251 esac
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
259 cat /bin/ls | dd of=/dev/random bs=8k 2>/dev/null
260
261 # Configure ccd devices.
262 #
263 if [ -r /etc/ccd.conf ]; then
264         ccdconfig -C
265 fi
266
267 case ${start_vinum} in
268 [Yy][Ee][Ss])
269         vinum start
270         ;;
271 esac
272
273 swapon -a
274
275 # Last chance to do things before potentially waiting for
276 # operator to do fsck related tasks
277 if [ -r /etc/rc.early ]; then
278         . /etc/rc.early
279 fi
280
281 case ${bootmode} in
282 autoboot)
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         ;;
340 esac
341
342 set -T
343 trap "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 #
348 case ${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         ;;
357 esac
358
359 umount -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.
363 networkfs_types='nfs:NFS smbfs:SMB portalfs:PORTAL'
364 case ${extra_netfs_types} in
365 [Nn][Oo])
366         ;;
367 *)
368         networkfs_types="${networkfs_types} ${extra_netfs_types}"
369         ;;
370 esac
371
372 # Mount everything except nfs filesystems.
373 mount_excludes='no'
374 for i in ${networkfs_types}; do
375         fstype=${i%:*}
376         mount_excludes="${mount_excludes}${fstype},"
377 done
378 mount_excludes=${mount_excludes%,}
379 mount -a -t ${mount_excludes}
380
381 case $? in
382 0)
383         ;;
384 *)
385         echo 'Mounting /etc/fstab filesystems failed, startup aborted'
386         exit 1
387         ;;
388 esac
389
390 # Run custom disk mounting function here
391 #
392 if [ -n "${diskless_mount}" -a -r "${diskless_mount}" ]; then
393                 sh ${diskless_mount}
394 fi
395
396 # If we booted a special kernel remove the record so we will boot
397 # the default kernel next time
398 rm -f /boot/nextboot.conf
399
400 # Reseed /dev/random with previously stored entropy.
401 case ${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         ;;
414 esac
415
416 case ${entropy_file} in
417 [Nn][Oo] | '')
418         ;;
419 *)
420         if [ -w /dev/random ]; then
421                 feed_dev_random "${entropy_file}"
422         fi
423         ;;
424 esac
425
426 adjkerntz -i
427
428 purgedir() {
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
452 clean_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.
471 rm -f /var/run/clean_var /var/spool/lock/clean_var
472 clean_var
473
474 # Add additional swapfile, if configured.
475 #
476 case ${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         ;;
485 esac
486
487 # Early pass to set the variables we can
488 #
489 if [ -r /etc/rc.sysctl ]; then
490         sh /etc/rc.sysctl first
491 fi
492
493 # Configure serial devices
494 #
495 if [ -r /etc/rc.serial ]; then
496         . /etc/rc.serial
497 fi
498
499 # Start up PC-card configuration
500 #
501 if [ -r /etc/rc.pccard ]; then
502         . /etc/rc.pccard
503 fi
504
505 # Start up the initial network configuration.
506 #
507 if [ -r /etc/rc.network ]; then
508         . /etc/rc.network       # We only need to do this once.
509         network_pass1
510 fi
511
512 case ${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         ;;
519 esac
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.
527 case "`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         ;;
548 esac
549
550 # Mount other network filesystems if present in /etc/fstab
551 for 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
565 done
566
567 # Whack the pty perms back into shape.
568 #
569 if 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]*
573 fi
574
575 # Clean up left-over files
576 #
577 clean_var                       # If it hasn't already been done
578 rm /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 #
587 case ${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         ;;
597 esac
598
599 # Remove X lock files, since they will prevent you from restarting X11
600 # after a system crash.
601 #
602 rm -f /tmp/.X*-lock
603 rm -fr /tmp/.X11-unix
604 mkdir -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.
610 case ${lomac_enable} in
611 [Yy][Ee][Ss])
612         kldload mac_lomac >/dev/null 2>&1
613         ;;
614 esac
615
616 echo -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 #
621 case ${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         ;;
634 esac
635
636 echo '.'
637
638 # Build device name databases if we are not using DEVFS
639 #
640 if sysctl vfs.devfs.generation > /dev/null 2>&1 ; then
641         rm -f /var/run/dev.db
642 else
643         dev_mkdb
644 fi
645
646 # $dumpdir should be a directory or a symbolic link
647 # to the crash directory if core dumps are to be saved.
648 #
649 if [ "${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
663 fi
664
665 if [ -n "${network_pass1_done}" ]; then
666         network_pass2
667 fi
668
669 # Enable/Check the quotas (must be after ypbind if using NIS)
670 #
671 case ${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         ;;
685 esac
686
687 if [ -n "${network_pass2_done}" ]; then
688         network_pass3
689 fi
690
691 # Check the password temp/lock file
692 #
693 if [ -e /etc/ptmp ]; then
694         logger -s -p auth.err \
695         "password file may be incorrect -- /etc/ptmp exists"
696 fi
697
698 case ${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         ;;
708 esac
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 #
713 ldconfig="/sbin/ldconfig"
714 case ${ldconfig_insecure} in
715 [Yy][Ee][Ss])
716         ldconfig="${ldconfig} -i"
717         ;;
718 esac
719 if [ -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
744 fi
745
746 # Now start up miscellaneous daemons that don't belong anywhere else
747 #
748 echo -n 'Starting standard daemons:'
749 case ${inetd_enable} in
750 [Nn][Oo])
751         ;;
752 *)
753         echo -n ' inetd'; ${inetd_program:-/usr/sbin/inetd} ${inetd_flags}
754         ;;
755 esac
756
757 case ${cron_enable} in
758 [Nn][Oo])
759         ;;
760 *)
761         echo -n ' cron';        ${cron_program:-/usr/sbin/cron} ${cron_flags}
762         ;;
763 esac
764
765 case ${lpd_enable} in
766 [Yy][Ee][Ss])
767         echo -n ' printer';     ${lpd_program:-/usr/sbin/lpd} ${lpd_flags}
768         ;;
769 esac
770
771 case ${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         ;;
778 esac
779
780 case ${usbd_enable} in
781 [Yy][Ee][Ss])
782         echo -n ' usbd';        /usr/sbin/usbd ${usbd_flags}
783         ;;
784 esac
785
786 case ${mta_start_script} in
787 /*)
788         if [ -r ${mta_start_script} ]; then
789                 sh ${mta_start_script}
790         fi
791         ;;
792 esac
793
794 echo '.'
795
796 # Recover vi editor files.
797 find /var/tmp/vi.recover ! -type f -a ! -type d -delete
798 vibackup=`echo /var/tmp/vi.recover/vi.*`
799 if [ "${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 '.'
836 fi
837
838 # Make a bounds file for msgs(1) if there isn't one already
839 #
840 if [ -d /var/msgs -a ! -f /var/msgs/bounds -a ! -L /var/msgs/bounds ]; then
841         echo 0 > /var/msgs/bounds
842 fi
843
844 case ${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         ;;
858 esac
859
860 # Run rc.devfs if readable to customize devfs
861 #
862 if [ -r /etc/rc.devfs ]; then
863         sh /etc/rc.devfs
864 fi
865
866 # Configure implementation specific stuff
867 #
868 arch=`uname -p`
869 if [ -r /etc/rc.${arch} ]; then
870         . /etc/rc.${arch}
871 fi
872
873 # Configure the system console
874 #
875 if [ -r /etc/rc.syscons ]; then
876         . /etc/rc.syscons
877 fi
878
879 echo -n 'Additional ABI support:'
880
881 # Load the SysV IPC API if requested.
882 case ${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         ;;
889 esac
890
891 # Start the Linux binary compatibility if requested.
892 #
893 case ${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         ;;
903 esac
904
905 # Start the SysVR4 binary emulation if requested.
906 #
907 case ${svr4_enable} in
908 [Yy][Ee][Ss])
909         echo -n ' svr4';        kldload svr4 > /dev/null 2>&1
910         ;;
911 esac
912
913 echo '.'
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 #
932 if [ -r /etc/rc.local ]; then
933         echo -n 'Starting local daemons:'
934         sh /etc/rc.local
935         echo '.'
936 fi
937
938 # For each valid dir in $local_startup, search for init scripts matching *.sh
939 #
940 case ${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         ;;
970 esac
971
972 if [ -n "${network_pass3_done}" ]; then
973         network_pass4
974 fi
975
976 # Late pass to set variables we missed the first time
977 #
978 if [ -r /etc/rc.sysctl ]; then
979         sh /etc/rc.sysctl last
980 fi
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 #
985 case ${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         ;;
992 esac
993
994 # Start background fsck checks if necessary
995 case ${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         ;;
1006 esac
1007
1008 echo ''
1009
1010 date
1011
1012 exit 0
1013