#!/bin/sh
exec 2>&1
ebegin() { [ "${VERBOSE:-}" = no ] || echo "$@"; }
eend() { r=${1:-0}; shift || true; [ "$r" -eq 0 ] || [ "${VERBOSE:-}" = no ] || echo "$*" >&2; return "$r"; }
. /lib/init/vars.sh
umask 022
PROTECTED_MOUNTS="$(sed -n ':a;/^[^ ]* \/ /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts)"
WEAK_MTPTS=""; REG_MTPTS=""; TMPFS_MTPTS=""
while read -r DEV MTPT FSTYPE REST; do
	echo "$PROTECTED_MOUNTS" | grep -qsF "$DEV $MTPT " && continue
	case "$MTPT" in
	  /|/usr|/proc|/dev|/.dev|/dev/pts|/dev/shm|/dev/.static/dev|/proc/*|/sys|/sys/*|/run|/run/lock|/run/shm|/run/rpc_pipefs|/dev/vcs) continue ;;
	esac
	case "$FSTYPE" in
	  proc|procfs|linprocfs|sysfs|securityfs|usbfs|usbdevfs|devpts) continue ;;
	  tmpfs) TMPFS_MTPTS="$MTPT $TMPFS_MTPTS" ;;
	  *)
		if echo "$PROTECTED_MOUNTS" | grep -qs "^$DEV "; then WEAK_MTPTS="$MTPT $WEAK_MTPTS"
		else REG_MTPTS="$MTPT $REG_MTPTS"; fi ;;
	esac
done < /proc/mounts
if [ "$TMPFS_MTPTS" ]; then
	ebegin "Unmounting temporary filesystems"
	if [ "$VERBOSE" = no ]; then fstab-decode umount $TMPFS_MTPTS || true
	else fstab-decode umount -v $TMPFS_MTPTS || true; fi
	eend 0
fi
ebegin "Deactivating swap"
if [ "$VERBOSE" = no ]; then swapoff -a >/dev/null 2>&1 || true; else swapoff -a -v || true; fi
eend 0
if [ "$WEAK_MTPTS" ]; then
	ebegin "Unmounting weak filesystems"
	if [ "$VERBOSE" = no ]; then fstab-decode umount -r -d $WEAK_MTPTS || true
	else fstab-decode umount -v -r -d $WEAK_MTPTS || true; fi
	eend 0
fi
if [ "$REG_MTPTS" ]; then
	ebegin "Unmounting local filesystems"
	if [ "$VERBOSE" = no ]; then fstab-decode umount -f -r -d $REG_MTPTS || true
	else fstab-decode umount -f -v -r -d $REG_MTPTS || true; fi
	eend 0
fi
exit 0
