#! /bin/sh
### BEGIN INIT INFO
# Provides:          umountroot
# Required-Start:    umountfs
# Required-Stop:     umountfs
# Default-Start:     6
# Default-Stop:
# Short-Description: Mount the root filesystem read-only.
### END INIT INFO

PATH=/sbin:/bin
. /lib/init/vars.sh

. /lib/lsb/init-functions

remount_ro () {
	local MTPT=$1
	[ "$VERBOSE" = no ] || log_action_begin_msg "Mounting $MTPT filesystem read-only"
	MOUNT_FORCE_OPT=
	[ "$(uname -s)" = "GNU/kFreeBSD" ] && MOUNT_FORCE_OPT=-f
	# This:
	#     mount -n -o remount,ro /
	# will act on a bind mount of / if there is one.
	# See #339023 and the comment in checkroot.sh
	mount    $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev $MTPT 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro              dummydev $MTPT 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro                       $MTPT
	ES=$?
	[ "$VERBOSE" = no ] || log_action_end_msg $ES
}

do_stop () {
	# These directories must exist on the root filesystem as they are
	# targets for system mountpoints.  We've just unmounted all other
	# filesystems, so either they are mounted now (in which case the
	# mount point exists) or we can make the mountpoint.
	for dir in /proc /sys /var/run /var/lock; do
	    mkdir -p $dir || true
	done
	exec 9<&0 < /proc/mounts

	REG_MTPTS=""
	TMPFS_MTPTS=""
	while read DEV MTPT FSTYPE REST
	do
		case "$MTPT" in
		  /proc|/dev|/.dev|/dev/pts|/dev/shm|/proc/*|/sys|/var/run|/var/lock)
			continue
			;;
		esac
		case "$FSTYPE" in 
		  proc|procfs|linprocfs|devfs|sysfs|usbfs|usbdevfs|devpts|tmpfs)
			continue
			;;
		  *)
			remount_ro $MTPT
			;;
		esac
	done

	exec 0<&9 9<&-
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

:
