#!/bin/sh

. /lib/partman/definitions.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 -a $id/formatted -nt $id/method ]
	    then
		continue
	    fi
	    log "Try to format swap space in $dev/$id"
	    template=partman-basicfilesystems/progress_swap_formatting
	    open_dialog PARTITION_INFO $id
	    read_line x1 x2 x3 x4 x5 device x6
	    close_dialog
	    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.
		    old_uuid="$(dd if=$device bs=1 skip=1036 count=16 2>/dev/null || true)"
		fi
	    fi
	    db_subst $template PARTITION "$num"
	    db_subst $template DEVICE $(humandev $(cat device))
	    name_progress_bar $template
	    open_dialog CREATE_FILE_SYSTEM $id linux-swap
	    read_line status
	    close_dialog
	    sync
	    if [ "$status" != OK ]; then
		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
	    fi
	    
	    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 [ "$old_uuid" ]; then
		# Restore the old UUID so that systems using UUIDs in
		# /etc/fstab don't unexpectedly end up without swap.
		printf %s "$old_uuid" | dd of=$device bs=1 seek=1036 count=16 conv=notrunc 2>/dev/null || true
	    fi
	    >$id/formatted
	fi
    done
done
