#!@PREFIX@/sbin/runscript # Copyright 2007-2008 Roy Marples # All rights reserved. Released under the 2-clause BSD license. description="Check and repair filesystems according to /etc/fstab" _IFS=" " depend() { use dev clock modules keyword nojail noopenvz noprefix notimeout novserver } _abort() { rc-abort return 1 } # We should only reboot when first booting _reboot() { if [ "${RC_RUNLEVEL}" = "${RC_BOOTLEVEL}" ]; then reboot "$@" _abort || return 1 fi } _forcefsck() { [ -e /forcefsck ] || get_bootparam forcefsck } start() { local fsck_opts= p= check_extra= if [ -e /fastboot ]; then ewarn "Skipping fsck due to /fastboot" return 0 fi if _forcefsck; then fsck_opts="${fsck_opts} -f" check_extra="(check forced)" fi if [ -n "${fsck_passno}" ]; then check_extra="[passno ${fsck_passno}] ${check_extra}" fi ebegin "Checking local filesystems ${check_extra}" for p in ${fsck_passno}; do local IFS="${_IFS}" case "${p}" in [0-9]*) p="=${p}";; esac set -- "$@" $(fstabinfo --passno "${p}") unset IFS done if [ "${RC_UNAME}" = "Linux" ]; then fsck_opts="${fsck_opts} -C0 -T" if [ -z "${fsck_passno}" ]; then fsck_args=${fsck_args--A -p} if echo 2>/dev/null >/.test.$$; then rm -f /.test.$$ fsck_opts="${fsck_opts} -R" fi fi fi trap : INT QUIT fsck ${fsck_args--p} ${fsck_opts} "$@" case $? in 0) eend 0; return 0;; 1) ewend 1 "Filesystems repaired"; return 0;; 2|3) if [ "${RC_UNAME}" = "Linux" ]; then ewend 1 "Filesystems repaired, but reboot needed" _reboot -f else ewend 1 "Filesystems still have errors; manual fsck required" fi;; 4) if [ "${RC_UNAME}" = "Linux" ]; then ewend 1 "Fileystem errors left uncorrected" return 0 else ewend 1 "Filesystems repaired, but reboot needed" _reboot fi;; 8) ewend 1 "Operational error"; return 0;; 12) ewend 1 "fsck interupted";; *) eend 2 "Filesystems couldn't be fixed";; esac _abort || return 1 } stop() { # Fake function so we always shutdown correctly. _abort() { return 0; } _reboot() { return 0; } _forcefsck() { return 1; } yesno "${fsck_shutdown}" && start return 0 }