#!/bin/ash

do_exit() {
	[ "$SAVE_MTD" ] && umount "$SAVE_MP" 2>/dev/null
	[ "$DEST_MTD" ] && umount "$DEST_MP" 2>/dev/null
	[ "$XPID" ] && kill -9 $XPID 2>/dev/null
	[ "$1" ] && echo "${1}"
	exit $2
}

error_exit() {
	do_exit "$1" 1
}

normal_exit() {
	do_exit "$1" 0
}

EXE_DIR="$(dirname $(readlink -f ${0}))"
COMN_FN="$EXE_DIR/frugalpup-common"
[ -f "$COMN_FN" ] && . "$COMN_FN"

[ -f "$UTILS_DIR/functions_part" ] || error_exit "File <span foreground='purple'>$UTILS_DIR/functions_part</span> not found."
. "$UTILS_DIR/functions_part"


SRC_TYPE=''; SRC_FN=''; SRC_DIR=''
SFS_PART=''; SFS_DIR=''; SAVE_PART=''; SAVE_DIR=''
XTRA_PARMS=''; PFIX_PARMS=''

[ "$CACHE_FN" ] && [ -f "$CACHE_FN" ] && . "$CACHE_FN"

[ "$SRC_TYPE" ] || error_exit "No source type specified"
if [ "$SRC_FN" = "" ]; then
	if [ "$SRC_DIR" = "" ]; then
		error_exit "No source specified"
	fi
fi
[ "$SFS_PART" ] || error_exit "No install partition specified"
if [ "$SFS_DIR" ]; then
	DEST_DISP="${SFS_PART}:${SFS_DIR}"
else
	DEST_DISP="$SFS_PART"
fi
gtkdialog-splash -bg yellow -close box -text "Copying Puppy files to $DEST_DISP" &
XPID=$!

ensure_mounted "$SFS_PART"
DEST_MP="$ensure_mounted_MP"
DEST_MTD="$ensure_mounted_DID"
[ "$ensure_mounted_MP" ] || error_exit "Could not mount \"$SFS_PART\"."
if [ "$SFS_DIR" ]; then
	DEST_DIR="${DEST_MP}${SFS_DIR}"
	[ -d "$DEST_DIR" ] || mkdir -p "$DEST_DIR"
else
	DEST_DIR="$DEST_MP"
fi

if [ "$SRC_FN" ]; then
	case $SRC_TYPE in
		iso)
			TMP_MP=/tmp/ISO$$
			[ -d "$TMP_MP" ] || mkdir -p "$TMP_MP"
			mount -o loop,ro "$SRC_FN" "$TMP_MP"
			[ $? -eq 0 ] || error_exit "Mount of file \"$SRC_FN\" failed."
			SRC_DIR="$TMP_MP"
			;;
		zip)
			PUP_SFS="$(unzip -Z1 "$SRC_FN" | grep -v '/$' | grep '.sfs$' | grep 'puppy_')"
			case $PUP_SFS in
				*/*) PUP_DIR="${PUP_SFS%/*}/" ;;
				*) PUP_DIR='' ;;
			esac
			unzip -u -o -j "$SRC_FN" "${PUP_DIR}*" -d "$DEST_DIR"
			;;
	esac
fi

if [ "$SRC_DIR" ]; then
	# copy kernel and initramfs (and release_initrd.gz)
	for oneFile in vmlinuz initrd.gz release_initrd.gz; do
		if [ -f "$SRC_DIR/$oneFile" ]; then
			if [ ! -f "$DEST_DIR/$oneFile" -o "$SRC_DIR/$oneFile" -nt "$DEST_DIR/$oneFile" ]; then
#				echo "$oneFile"
				cp -af "$SRC_DIR/$oneFile" "$DEST_DIR"
			fi
		fi
	done
	sync
	# copy mi initramfs
	MI_INITRD="$(find "$SRC_DIR" -maxdepth 1 -type f -name 'mi?_initrd.gz')"
	if [ "$MI_INITRD" ]; then
		for onePath in $MI_INITRD; do
			oneFile="${onePath##*/}"
			if [ ! -f "$DEST_DIR/$oneFile" -o "$MI_INITRD" -nt "$DEST_DIR/$oneFile" ]; then
#				echo "$oneFile"
				cp -af "$MI_INITRD" "$DEST_DIR"
			fi
		done
		sync
	fi
	# copy *sfs
	SFSES="$(find "$SRC_DIR" -maxdepth 1 -type f -name '*sfs')"
	for onePath in $SFSES; do
		oneFile="${onePath##*/}"
#		[ "${oneFile:0:4}" = "devx" ] && continue
		if [ ! -f "$DEST_DIR/$oneFile" -o "$onePath" -nt "$DEST_DIR/$oneFile" ]; then
#			echo "$oneFile"
			cp -af "$onePath" "$DEST_DIR"
		fi
	done
	sync
	if [ "$TMP_MP" ]; then
		umount "$TMP_MP"
		rmdir "$TMP_MP"
	fi
fi

[ -f "$DEST_DIR/$PARMS_FN" ] && rm "$DEST_DIR/$PARMS_FN"

if [ "$SAVE_PART" ]; then
	get_part_id "$SAVE_PART"
	SAVE_ID="$get_part_id_RET"
	ensure_mounted "$SAVE_PART"
	SAVE_MP="$ensure_mounted_MP"
	SAVE_MTD="$ensure_mounted_DID"
	[ "$ensure_mounted_MP" ] || error_exit "Could not mount \"$SAVE_PART\"."
	[ -d "${SAVE_MP}${SAVE_DIR}" ] || mkdir -p "${SAVE_MP}${SAVE_DIR}"
	get_device "$SAVE_PART"
	SAVE_DEV="$get_device_RET"
	get_device "$SFS_PART"
	if [ "$SAVE_DEV" = "$get_device_RET" -a "$SAVE_DIR" = "${DEST_DIR#${DEST_MP}}" ]; then
		SAVE_NO_NUM="${SAVE_PART%[0-9]}"; SAVE_NO_NUM="${SAVE_NO_NUM%[0-9]}"; SAVE_NO_NUM="${SAVE_NO_NUM%[0-9]}"
		echo "PSAVEMARK=${SAVE_PART#${SAVE_NO_NUM}}" >> "$DEST_DIR/$PARMS_FN"
	else
		echo "PSAVEID='$SAVE_ID'" >> "$DEST_DIR/$PARMS_FN"
		echo "PSAVEDIR='$SAVE_DIR'" >> "$DEST_DIR/$PARMS_FN"
	fi
fi

[ "$XTRA_PARMS" ] && echo "PKNLPARMS='$XTRA_PARMS'" >> "$DEST_DIR/$PARMS_FN"
[ "$PFIX_PARMS" ] && echo "PFIXPARMS='$PFIX_PARMS'" >> "$DEST_DIR/$PARMS_FN"

sync
[ "$SAVE_MTD" ] && umount "$SAVE_MP"
sync
if [ "$DEST_MTD" ]; then
	sleep 1
	umount "$DEST_MP"
	[ $? -eq 0 ] || { sleep 1; umount "$DEST_MP"; }
fi

kill -9 $XPID

normal_exit

exit
