#!/bin/sh

ARCH="$(archdetect)"

# The mkswap utility only supports Linux-type swap partitions, used
# on Linux and Hurd;  do not use it on kfreebsd which does need to
# format swap partitions
case $ARCH in
    kfreebsd-*)
        exit 0
        ;;
    *)
        ;;
esac

. /lib/partman/lib/base.sh

for dev in $DEVICES/*; do
	[ -d "$dev" ] || continue
	cd $dev
	partitions=
	open_dialog PARTITIONS
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		[ "$fs" != free ] || continue
		partitions="$partitions $id,$num"
	done
	close_dialog

	for part in $partitions; do
		id=${part%,*}
		num=${part#*,}
		[ -f $id/method -a -f $id/format ] || continue
		method=$(cat $id/method)
		if [ "$method" = swap ]; then
			if [ -f $id/formatted ] && \
			   [ $id/formatted -nt $id/method ]; then
				continue
			fi
			log "Try to format swap space in $dev/$id"
			disable_swap "$dev" "$id" || true
			template=partman-basicfilesystems/progress_swap_formatting
			open_dialog PARTITION_INFO $id
			read_line x1 x2 x3 x4 x5 device x6
			close_dialog
			rm -f $id/old_uuid
			if [ -f $id/detected_filesystem ]; then
				old_fs=$(cat $id/detected_filesystem)
				if [ "$old_fs" = linux-swap ]; then
					# Save the old UUID so that we can restore it later.
					dd if=$device of=$id/old_uuid bs=1 skip=1036 count=16 2>/dev/null || true
				fi
			fi
			db_subst $template PARTITION "$num"
			db_subst $template DEVICE $(humandev $(cat device))
			db_progress START 0 3 partman/text/formatting
			db_progress INFO $template
			db_progress SET 1
			# According to Szabolcs Szakacsits, the NTFS-3g author, it is
			# safer to format the loop file, rather than the device.
			[ ! -s loop ] || device="$(cat loop)"
			if log-output -t partman --pass-stdout \
			   mkswap $device >/dev/null; then
				sync
				status=OK
			else
				status=failed
			fi
			db_progress STOP

			if [ "$status" != OK ]; then
				db_subst partman-basicfilesystems/create_swap_failed TYPE linux-swap
				db_subst partman-basicfilesystems/create_swap_failed PARTITION "$num"
				db_subst partman-basicfilesystems/create_swap_failed DEVICE $(humandev $(cat device))
				db_input critical partman-basicfilesystems/create_swap_failed || true
				db_go || true
				exit 1
			fi
			if [ -s "$id/old_uuid" ]; then
				# Restore the old UUID so that systems using UUIDs in
				# /etc/fstab don't unexpectedly end up without swap.
				dd if=$id/old_uuid of=$device bs=1 seek=1036 count=16 conv=notrunc 2>/dev/null || true
			fi
			rm -f $id/old_uuid
			>$id/formatted
		fi
	done
done
