#!/bin/sh
#
# $NetBSD: swap1,v 1.13 2018/10/19 14:11:12 martin Exp $
#

# PROVIDE: localswap
# REQUIRE: DISKS root
# KEYWORD: shutdown

$_rc_subr_loaded . /etc/rc.subr

name="swap1"
start_cmd="swap1_start"
stop_cmd="swap1_stop"

dev_free_tmpfs()
{
	# Generate a list of tmpfs filesystems that contain no device nodes,
	# which can presumably be unmounted safetly at shutdown time.
	# Filenames are quoted and the list contains no unquoted newlines,
	# so that the output can be reparsed as a single argument list.
	mount -t tmpfs | while read -r line
	do
		fs=${line#tmpfs on }
		fs=${fs% type tmpfs*}
		find -x "${fs}" \( -type b -or -type c \) -exit 1 &&
			echo -n "'${fs}' "
	done
}

umount_vm_consumers()
{
	case ${swapoff_umount} in
		auto)
			swapoff_umount_fs="$(dev_free_tmpfs)"
			;;
		manual)
			# swapoff_umount_fs set manually
			;;
	esac
	# eval so that quotes within $swapoff_umount_fs are parsed properly
	eval set -- "${swapoff_umount_fs}"
	for fs in "$@"
	do
		echo "Forcibly unmounting ${fs}"
		umount -ft tmpfs "${fs}"
	done
}

#		Add all block-type swap devices; these might be necessary
#		during disk checks.
#
swap1_start()
{
	# Treat exit status 2 from swapctl(8) as successful; it means
	# "no error, but no suitable swap devices were configured".
	#
	if ! checkyesno no_swap; then
		swapctl -A -t blk || [ $? = 2 ]
	fi
}

#		Remove all block-type swap devices
#
swap1_stop()
{
	if checkyesno swapoff || [ -n "$rc_force" ]; then
		umount_vm_consumers
		echo "Removing block-type swap devices"
		swapctl -U -t blk || [ $? = 2 ]
	fi
}

load_rc_config swap
run_rc_command "$1"
