#!/usr/local/bin/cbsd
#v11.1.4
MYARG="jname"
MYOPTARG="fstab zfs"
MYDESC="Undelegate ZFS filesystem from jail"
ADDHELP="zfs - source zfs filesystem, jname - destination jail. fstab - mount via fstab file records\n"

. ${subrdir}/nc.subr

. ${cbsdinit}

[ ${zfsfeat} -eq 0 ] && exit
[ -n "${fstab}" -a ! -f "${fstab}" ] && err 1 "${fstab} does not exist"
[ -z "${zfs}" -a -z "${fstab}" ] && err 1 "${N1_COLOR}detachzfs: ${N2_COLOR}zfs=${N1_COLOR} or ${N2_COLOR}fstab= ${N1_COLOR} is necessary${N0_COLOR}"

zfs_check_and_deattach()
{
	local _err
	zfsfs ${1}

	_err=$?

	case "${_err}" in
		0)
			return 0
			;;
		1)
			${ZFS_CMD} unmount -f ${1}
			;;
		2)
			;;
		*)
			return 0
	esac

	# no we ready for dettaching ${zfs} from $jname
	${ZFS_CMD} set jailed=off ${1}
	${ZFS_CMD} unjail ${jname} ${1}
	${ZFS_CMD} set mountpoint=none ${1}

	return 2
}

mount_via_fstab()
{
	${CAT_CMD} ${fstab} | while read _device _mountpt _fs _mode _a _b; do
		case ":${_device}" in
			:#* | :)
				continue
				;;
		esac

		[ "${_fs}" != "zfs" -o -z "${_device}" ] && continue
		zfs_check_and_deattach ${_device}
		case $? in
			0)
				${ECHO} "${N1_COLOR}detachzfs: ${_device} is not valid ZFS filesystem${N0_COLOR}"
				return 0
				;;
			2)
				;;
			*)
				${ECHO} "${N1_COLOR}detachzfs: Unknown error while test for zfsfs ${_device}. Skip${N0_COLOR}"
				return 0
				;;
		esac
	done

	exit 0
}

. ${subrdir}/rcconf.subr
[ $? -eq 1 ] && err 1 "${N1_COLOR}detachzfs: no such jail: ${N2_COLOR}${jname}${N0_COLOR}"
[ ${status} -ne 1 ] && err 1 "${N1_COLOR}detachzfs: jail is not running: ${N2_COLOR}${jname}${N0_COLOR}"

. ${subrdir}/zfs.subr
[ -n "${fstab}" ] && mount_via_fstab

zfs_check_and_deattach ${zfs}

case $? in
	0)
		err 1 "${N1_COLOR}detachzfs: ${zfs} is not valid ZFS filesystem${N0_COLOR}"
		;;
	2)
		;;
	*)
		err 1 "${N1_COLOR}detachzfs: Unknown error while test for zfsfs ${zfs}. Skip${N0_COLOR}"
		;;
esac
