openrc/init.d/checkroot
Roy Marples 5af58b4514 Rewrite the core parts in C. We now provide librc so other programs can
query runlevels, services and state without using bash. We also provide
libeinfo so other programs can easily use our informational functions.

As such, we have dropped the requirement of using bash as the init script
shell. We now use /bin/sh and have strived to make the scripts as portable
as possible. Shells that work are bash and dash. busybox works provided
you disable s-s-d. If you have WIPE_TMP set to yes in conf.d/bootmisc you
should disable find too.
zsh and ksh do not work at this time.

Networking support is currently being re-vamped also as it was heavily bash
array based. As such, a new config format is available like so
config_eth0="1.2.3.4/24 5.6.7.8/16"
or like so
config_eth0="'1.2.3.4 netmask 255.255.255.0' '5.6.7.8 netmask 255.255.0.0'"

We will still support the old bash array format provided that /bin/sh IS
a link it bash.

ChangeLog for baselayout-1 can be found in our SVN repo.
2007-04-05 11:18:42 +00:00

150 lines
3.6 KiB
Plaintext
Executable File

#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
do_mtab() {
# Don't create mtab if /etc is readonly
if ! touch /etc/mtab 2> /dev/null ; then
ewarn "Skipping /etc/mtab initialization" "(ro root?)"
return 0
fi
# Clear the existing mtab
> /etc/mtab
# Add the entry for / to mtab
mount -f /
# Don't list root more than once
grep -v "^[^ ]* / " /proc/mounts >> /etc/mtab
# Now make sure /etc/mtab have additional info (gid, etc) in there
local mnt= mnts="$(mountinfo | sed -e "s/^/'/g" -e "s/$/'/g")"
eval set -- ${mnts}
for mnt in "$@" ; do
if fstabinfo --mount-cmd "${mnt}" >/dev/null ; then
mount -f -o remount "${mnt}"
fi
done
# Remove stale backups
rm -f /etc/mtab~ /etc/mtab~~
}
start() {
local retval=0
# Don't bother doing a fsck on these
if [ -n "${CDBOOT}" ] || is_net_fs / || is_union_fs / ; then
return 0
fi
if touch /.test.$$ 2> /dev/null ; then
einfo "root filesystem is mounted read-write - skipping"
rm -f /.test.$$
return 0
fi
if get_bootparam "forcefsck" ; then
ebegin "Checking root filesystem (full fsck forced)"
if [ "${RC_UNAME}" = "Linux" ] ; then
fsck -C -a -f /
else
fsck -F /
fi
# /forcefsck isn't deleted because checkfs needs it.
# it'll be deleted in that script.
retval=$?
else
# Obey the fs_passno setting for / (see fstab(5))
# - find the / entry
# - make sure we have 6 fields
# - see if fs_passno is something other than 0
local pass=$(fstabinfo --passno /)
if [ ${pass:-0} != "0" ] ; then
ebegin "Checking root filesystem"
if [ "${RC_UNAME}" = "Linux" ] ; then
fsck -C -T -a /
else
fsck -p -F /
fi
retval=$?
else
ebegin "Skipping root filesystem check" "(fstab's passno == 0)"
retval=0
fi
fi
if [ ${retval} -eq 0 ] ; then
eend 0
elif [ ${retval} -eq 1 ] ; then
ewend 1 "Filesystem repaired"
retval=0
elif [ ${retval} -eq 8 ] ; then
ewend 1 $"Operational error, continuing"
retval=0
elif [ ${retval} -eq 2 -o ${retval} -eq 3 ] ; then
ewend 1 "Filesystem repaired, but reboot needed!"
if [ "${RC_FORCE_AUTO}" != "yes" ] ; then
printf "\a"; sleep 1; printf "\a"; sleep 1
printf "\a"; sleep 1; printf "\a"; sleep 1
ewarn "Rebooting in 10 seconds ..."
sleep 10
fi
einfo "Rebooting"
/sbin/reboot -f
else
if [ "${RC_FORCE_AUTO}" = "yes" ] ; then
eend 2 "Rerunning fsck in force mode"
if [ "${RC_UNAME}" = "Linux" ] ; then
fsck -y -C -T /
else
fsck -y /
fi
retval=$?
else
eend 2 "Filesystem couldn't be fixed :("
[ "${RC_UNAME}" = "Linux" ] || return 1
sulogin "${CONSOLE}"
fi
if [ ${retval} != "0" ] ; then
einfo "Unmounting filesystems"
if [ "${RC_UNAME}" = "Linux" ] ; then
mount -a -o remount,ro /
else
mount -u -o ro /
fi
einfo "Rebooting"
reboot -f
fi
fi
ebegin "Remounting root filesystem read/write"
if [ "${RC_UNAME}" = "Linux" ] ; then
mount -n -o remount,rw /
else
mount -u -o rw /
fi
eend $? "Root filesystem could not be mounted read/write :(" || return 1
# Only Linux has mtab
[ "${RC_UNAME}" = "Linux" ] && do_mtab
# If the user's /dev/null or /dev/console are missing, we
# should help them out and explain how to rectify the situation
if [ ! -c /dev/null -o ! -c /dev/console ] ; then
if [ -e /usr/share/baselayout/issue.devfix ] ; then
# Backup current /etc/issue
if [ -e /etc/issue -a ! -e /etc/issue.devfix ] ; then
mv -f /etc/issue /etc/issue.devfix
fi
cp -f /usr/share/baselayout/issue.devfix /etc/issue
fi
fi
# We got here, so return 0
return 0
}
# vim: set ts=4 :