#!/bin/sh

if [ "$1" != "-go" ]; then
	ffout="$1"
	if [ -z "$ffout" ] || [ ! -f "$ffout" ]; then
		echo "Input file missing.">&2
		exit 1
	fi

	BINMAGIC=$(dd if="$ffout" bs=4 count=1 2>/dev/null)
	case "$BINMAGIC" in
		W54G|W54S|W54A|W54s)
			# linksys/allnet
			SKIP=32
		;;
		LOAD)
			# se505
			SKIP=28
		;;
		HDR0)
			# trx
			SKIP=0
		;;
		*)
			echo "Bad Header $BINMAGIC: aborted.">&2
			rm -f "$ffout"
			exit 1
		;;
	esac

	if ! /www/cgi-bin/freifunk-upload -c "$ffout" $SKIP; then
		echo "CRC error: aborted.">&2
		rm -f "$ffout"
		exit 1
	fi
	outdev=/dev/null
	test -e /dev/tts/0 && outdev=/dev/tts/0
	$0 -go "$ffout" $SKIP>$outdev 2>&1 &
	exit 0
fi

trap "" SIGHUP
trap "" SIGTERM

sleep 1
killall5 -HUP
test -f /etc/dropbear/dropbear_dss_host_key && nvram set ff_dsskey=$(/www/cgi-bin/freifunk-upload -b2a</etc/dropbear/dropbear_dss_host_key)
nvram set ff_reset=format
nvram commit
killall5 -TERM
sleep 1

WLDEV=$(awk 'sub(":","") {print $1}' /proc/net/wireless)
if false && [ -n "$WLDEV" ]; then
	# Speed up flash, does not work with new wl.o
	wlconf $WLDEV down
	ip link set dev $WLDEV down
	rmmod wl
fi

mkdir -p /tmp/burn.$$/bin
mkdir -p /tmp/burn.$$/dev
mkdir -p /tmp/burn.$$/lib
mkdir -p /tmp/burn.$$/proc
mount none /tmp/burn.$$/dev -t devfs
mount none /tmp/burn.$$/proc -t proc
mv "$2" /tmp/burn.$$/
unset rom
test -f /rom/bin/busybox && rom=/rom
cp -a $rom/sbin/mtd $rom/sbin/mtdkill /tmp/burn.$$/bin/
cp -a $rom/lib/ld-uClibc* $rom/lib/libc* $rom/lib/libuClibc*\
 $rom/usr/lib/libnvram.so $rom/usr/lib/libshared.so /tmp/burn.$$/lib/
echo 0x04>/proc/sys/diag
exec chroot /tmp/burn.$$ /bin/mtdkill write "${2#/tmp}" linux $3
