#!/bin/sh
#Copyright: 2026 Aitor <aitor@genuen.org>
#License: CC0-1.0
#Comment: oneshot; invoke with: sv once umountfs

exec 2>&1

ebegin() { [ "${VERBOSE:-}" = no ] || echo "$@"; }
eend() { r=${1:-0}; shift || true; [ "$r" -eq 0 ] || [ "${VERBOSE:-}" = no ] || echo "$*" >&2; return "$r"; }
einfo() { [ "${VERBOSE:-}" = no ] || echo "$@"; }
ewarn() { echo "$@" >&2; }
eerror() { echo "$@" >&2; }

. /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
	else
		fstab-decode umount -v $TMPFS_MTPTS
	fi
	eend $?
fi

ebegin "Deactivating swap"
if [ "$VERBOSE" = no ]; then
	swapoff -a >/dev/null
else
	swapoff -a -v
fi
eend $?

if [ "$WEAK_MTPTS" ]; then
	ebegin "Unmounting weak filesystems"
	if [ "$VERBOSE" = no ]; then
		fstab-decode umount -r -d $WEAK_MTPTS
	else
		fstab-decode umount -v -r -d $WEAK_MTPTS
	fi
	eend $?
fi
if [ "$REG_MTPTS" ]; then
	ebegin "Unmounting local filesystems"
	if [ "$VERBOSE" = no ]; then
		fstab-decode umount -f -r -d $REG_MTPTS
	else
		fstab-decode umount -f -v -r -d $REG_MTPTS
	fi
	eend $?
fi
exit 0
