#!/bin/sh # Copyright 1997-2004 Apple Computer, Inc. . /etc/rc.common export -n SafeBoot export -n VerboseFlag export -n FsckSlash export -n NetBoot if [ -d /System/Installation -a -f /etc/rc.cdrom ]; then /etc/rc.cdrom multiuser # We shouldn't get here; CDIS should reboot the machine when done echo "CD-ROM boot procedure complete" halt fi if [ "${NetBoot}" = "-N" ] ; then echo "Initializing NetBoot" if ! sh /etc/rc.netboot start ; then echo NetBoot initialization failed, shut down in 10 seconds... sleep 10 halt fi fi if [ "${FsckSlash}" = "-F" ]; then # Benignly clean up ("preen") any dirty filesystems. # fsck -p will skip disks which were properly unmounted during # a normal shutdown. echo "Checking disk" if [ "${SafeBoot}" = "-x" ]; then fsck -fy || halt else fsck -p || fsck -fy || halt fi fi echo "Mounting local filesystems" mount -uw / [ -f /etc/fstab ] && mount -vat nonfs BootCacheControl=/System/Library/Extensions/BootCache.kext/Contents/Resources/BootCacheControl if [ ! -f $BootCacheControl ]; then BootCacheControl=/usr/sbin/BootCacheControl fi if [ "${SafeBoot}" != "-x" -a -x "${BootCacheControl}" ]; then ${BootCacheControl} start fi if [ -f /etc/sysctl-macosxserver.conf ]; then awk '{ if (!index($1, "#") && index($1, "=")) print $1 }' < /etc/sysctl-macosxserver.conf | while read do sysctl -w ${REPLY} done fi if [ -f /etc/sysctl.conf ]; then awk '{ if (!index($1, "#") && index($1, "=")) print $1 }' < /etc/sysctl.conf | while read do sysctl -w ${REPLY} done fi sysctl -w kern.sysv.shmmax=4194304 kern.sysv.shmmin=1 kern.sysv.shmmni=32 kern.sysv.shmseg=8 kern.sysv.shmall=1024 if [ -f /var/account/acct ]; then accton /var/account/acct fi if [ -f /etc/rc.installer_cleanup ]; then /etc/rc.installer_cleanup multiuser fi echo "Resetting files and devices" RMRF_ITEMS="/mach.sym /var/tmp/folders.*" ## # Attempt to recover the passwd file, if needed. This procedure is # primarily historical and makes sense only when the passwd file is edited # using the vipw command. ## if [ -s /etc/ptmp ]; then if [ -s /etc/passwd ]; then echo -n "Passwd file conflict with ptmp: " ls -l /etc/passwd /etc/ptmp echo "Moving ptmp to ptmp.save" mv -f /etc/ptmp /etc/ptmp.save else echo "Passwd file recovered from ptmp" mv /etc/ptmp /etc/passwd fi elif [ -r /etc/ptmp ]; then echo "Removing passwd lock file" RMRF_ITEMS="$RMRF_ITEMS /etc/ptmp" fi ## # If the shutdown command was used to shut the system down, the file # /etc/nologin may have been created to prevent users from logging in. # Remove it so that logins are enabled when the system comes up. ## RMRF_ITEMS="$RMRF_ITEMS /etc/nologin" # Clean out /private/tmp. if [ -d /private/tmp ]; then # blow away any _tmp_ in case it exists as well if [ -e /private/_tmp_ ]; then chflags -R -P 0 /private/_tmp_ rm -rf /private/_tmp_ fi mv /private/tmp /private/_tmp_ chflags -R -P 0 /private/_tmp_ RMRF_ITEMS="$RMRF_ITEMS /private/_tmp_" fi mkdir -p -m 01777 /private/var/tmp /private/tmp # Move /var/run out of the way if [ -d /var/run ]; then # blow away any _run_ in case it exists as well if [ -e /var/_run_ ]; then chflags -R -P 0 /var/_run_ rm -rf /var/_run_ fi mv /var/run /var/_run_ fi # Make new /var/run mkdir -m 775 /var/run mkdir -m 775 /var/run/StartupItems /var/run/davlocks mkdir -m 755 /var/run/proxy chown root:daemon /var/run /var/run/StartupItems chown www:www /var/run/proxy /var/run/davlocks # Move sudo back to /var/run, touch the contents of /var/run/sudo/* back to the epoch if [ -d /var/_run_/sudo ]; then mv /var/_run_/sudo /var/run/sudo touch -t 198501010000 /var/run/sudo/* fi # Clear utmp (who is logged on). touch /var/run/utmp /var/run/utmpx # purge the _run_ directory if it exists if [ -d /var/_run_ ]; then chflags -R -P 0 /var/_run_ RMRF_ITEMS="$RMRF_ITEMS /var/_run_" fi # Clear /var/spool/lock if [ -d /var/spool/lock ]; then find /var/spool/lock -not -type d -print0 | xargs -0 rm -f fi # if "/Desktop Folder" exists and has contents, make sure there is a # "/Desktop (Mac OS 9)" symlink to it # if "/Desktop Folder" does not exist, exists but has no contents, or exists # and has only a single file, ".DS_Store" then there should be no # "/Desktop (Mac OS 9)" symlink # if there is some other file or directory with the name "/Desktop (Mac OS 9)" # then just exit needlink=0 if [ -d "/Desktop Folder" ]; then needlink=$(ls -a1 "/Desktop Folder" | wc -l) if [ "${needlink}" -eq 3 ]; then if [ -f "/Desktop Folder/.DS_Store" ]; then needlink=0 fi fi fi if [ "${needlink}" -lt 3 ]; then if [ -h "/Desktop (Mac OS 9)" ]; then rm -f "/Desktop (Mac OS 9)" fi else if ! [ -e "/Desktop (Mac OS 9)" ]; then ln -s "/Desktop Folder" "/Desktop (Mac OS 9)" fi fi echo "Starting virtual memory" swapdir=/private/var/vm if [ "${NetBoot}" = "-N" ]; then sh /etc/rc.netboot setup_vm ${swapdir} fi if [ ! -d ${swapdir} ]; then echo "Creating default swap directory" mkdir -p -m 755 ${swapdir} chown root:wheel ${swapdir} else RMRF_ITEMS="${RMRF_ITEMS} ${swapdir}/swap*" fi echo Removing $RMRF_ITEMS rm -rf $RMRF_ITEMS if [ ${ENCRYPTSWAP:=-NO-} = "-YES-" ]; then encryptswap="-E" else encryptswap="" fi /sbin/dynamic_pager ${encryptswap} -F ${swapdir}/swapfile appprofiledir=/private/var/vm/app_profile if [ ! -d ${appprofiledir} ]; then if [ -f ${appprofiledir} ]; then mv -f ${appprofiledir} "${appprofiledir}_" fi mkdir -p -m 711 ${appprofiledir} chown root:wheel ${appprofiledir} fi # Create mach symbol file sysctl -n kern.symfile if [ -f /mach.sym ]; then ln -sf /mach.sym /mach else ln -sf /mach_kernel /mach fi if [ "${SafeBoot}" = "-x" ]; then echo "Configuring kernel extensions for safe boot" touch /private/tmp/.SafeBoot kextd -x else echo "Configuring kernel extensions" kextd fi if [ "${SafeBoot}" != "-x" -a -x "${BootCacheControl}" ]; then ${BootCacheControl} tag fi # Create local NetInfo database if it doesn't exist if [ ! -d /var/db/netinfo/local.nidb ]; then echo "Creating local NetInfo database" mkdir -p /var/db/netinfo /usr/libexec/create_nidb rm -f /var/db/.AppleSetupDone fi if [ -f /etc/security/rc.audit ]; then . /etc/security/rc.audit fi if [ -f /Library/Preferences/com.apple.sharing.firewall.plist ]; then /usr/libexec/FirewallTool fi # Load [ideally on demand] daemons /usr/libexec/register_mach_bootstrap_servers /etc/mach_init.d if [ "${SafeBoot}" = "-x" ]; then launchctl load /System/Library/LaunchDaemons else launchctl load /Library/LaunchDaemons /System/Library/LaunchDaemons SystemStarter ${VerboseFlag} fi /usr/sbin/update if [ "${NetBoot}" = "-N" ]; then sh /etc/rc.netboot setup_computername fi # Set language from CDIS.custom - assumes this is parse-able by sh if [ -f /var/log/CDIS.custom ]; then . /var/log/CDIS.custom fi # Start the Language Chooser. This code should be able to go away as far as I # know once loginwindow becomes more dynamic. STARTPBS="/System/Library/CoreServices/pbs" # apps stall w/o BUDDYCOOKIE="/var/db/.AppleSetupDone" LCACOOKIE="/var/db/.RunLanguageChooserToo" STARTLCA="/System/Library/CoreServices/Language Chooser.app/Contents/MacOS/Language Chooser" if [ -x "$STARTLCA" -a -x "$STARTPBS" -a ! -f "$BUDDYCOOKIE" -a -f "$LCACOOKIE" ]; then "$STARTPBS" & pbspid=$! "$STARTLCA" kill $pbspid # XSelect does this independently fi if [ ! -s "/var/log/CDIS.custom" ]; then echo "Language Chooser seems to have failed; defaulting to English" echo "LANGUAGE=English" > "/var/log/CDIS.custom" fi export LANGUAGE if [ -f /etc/rc.local ]; then sh /etc/rc.local fi touch /var/run/.systemStarterRunning if [ "${VerboseFlag}" != "-v" ] ; then /usr/libexec/WaitingForLoginWindow fi exit 0