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

setvar PATH = "/sbin:/bin"
source /lib/init/vars.sh

source /lib/lsb/init-functions

proc do_stop {
	test $VERBOSE = no || log_action_begin_msg "Mounting root filesystem read-only"
	# Ask init to re-exec itself before we go down if it has been
	# upgraded this cycle.  It'll lose all its state, but at least
	# it won't hold open files on the root filesystem (lp:#672177).
	if test -f /var/run/init.upgraded
	{
		setvar old_map = $( cat /proc/1/maps )
		setvar map = "$old_map"
		telinit u || :
		setvar i = '0'
		setvar timeout = '5'
		while [ "$map" = "$old_map" ]
		{
			sleep 1
			setvar map = $( cat /proc/1/maps )
			/usr/bin/logger "waiting for init to respawn"
			setvar i = $((i+1))
			if test $i -eq $timeout  {
				break
			}
		}

		if test $map = $old_map  {
			/usr/bin/logger "FAIL: init failed to respawn in $timeout seconds - unmounting anyway"
		} else {
			/usr/bin/logger "SUCCESS: init respawned after $i seconds (within $timeout seconds timeout)"
		}
	}

	setvar MOUNT_FORCE_OPT = ''
	test $(uname -s) = "GNU/kFreeBSD" && setvar 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 / 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro              dummydev / 2>/dev/null \
	|| mount $MOUNT_FORCE_OPT -n -o remount,ro                       /
	setvar ES = ""$?
	test $VERBOSE = no || log_action_end_msg $ES
}

case (1) {
  start|status {
	# 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
	}
}

: