#! /bin/sh
set -e

. /lib/partman/lib/base.sh

dev=${1%//*}
id=${1#*//}

cd $dev
device=$(humandev $(cat device))

# If the user wants to modify a device or partition
# the device may not be locked
if [ -e "$dev/locked" ]; then
	locked=$(cat "$dev/locked")
	db_subst partman-base/devicelocked DEVICE "$device"
	db_subst partman-base/devicelocked MESSAGE "$locked"
	db_set partman-base/devicelocked false
	db_input critical partman-base/devicelocked
	db_capb
	db_go || true
	db_capb backup align
	exit 0
fi

# Two scenarios to check for here:
# 1) If the user wants to modify a partition - it may not be locked
# 2) If the user wants to modify a device - none of its partitions may be locked
open_dialog PARTITIONS
while { read_line num tmpid size type fs path name; [ "$tmpid" ]; }; do
	if [ -n "$id" ]; then
		[ "$id" = "$tmpid" ] || continue
	fi

	if [ -e "$dev/$tmpid/locked" ]; then
		locked=$(cat "$dev/$tmpid/locked")
		db_subst partman-base/partlocked DEVICE "$device"
		db_subst partman-base/partlocked PARTITION "$num"
		db_subst partman-base/partlocked MESSAGE "$locked"
		db_set partman-base/partlocked false
		db_input critical partman-base/partlocked
		db_capb
		db_go || true
		db_capb backup align
		close_dialog
		exit 0
	fi
done
close_dialog


if [ -z "$id" ]; then
	# ask_user /lib/partman/storage_device "$dev" "$id" || true
	open_dialog GET_LABEL_TYPE
	read_line x
	close_dialog
	# do not try to create partition table on sw RAID device or LVM LV
	if [ "$x" = loop ]; then
		exit 0
	fi
	mklabel=$(echo /lib/partman/storage_device/[0-9][0-9]label/do_option)
	[ -x "$mklabel" ] || exit 0
	$mklabel label "$dev" || true
	exit 0
else
	open_dialog PARTITION_INFO $id
	read_line num id size type fs path name
	close_dialog
	[ "$id" ] || exit 0
	case "$fs" in
	    free)
		ask_user /lib/partman/free_space "$dev" "$id" || true
		;;
	    *)
		while true; do
			set +e
			local code=0
			ask_active_partition "$dev" "$id" "$num" || code=$?
			if [ "$code" -ge 128 ] && [ "$code" -lt 192 ]; then
				exit "$code" # killed by signal
			elif [ "$code" -ge 100 ]; then
				break
			fi
			set -e
		done
		;;
	esac
fi
