#!/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 [ -x /www/cgi-bin/freifunk-upload ]; then
		if ! /www/cgi-bin/freifunk-upload -c "$ffout" $SKIP; then
			echo "CRC error: aborted.">&2
			rm -f "$ffout"
			exit 1
		fi
	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
nvram set ff_reset=format
nvram commit
killall5 -TERM
sleep 1
echo 0x04>/proc/sys/diag

WLDEV=$(l=$(grep : /proc/net/wireless);l=${l%:*};echo ${l##* })
if [ -n "$WLDEV" ]; then
	ip link set dev $WLDEV down
	wifi down
	# Unloading wl.o does not work / will hangup script
	# rmmod wl
fi
rmmod wlcompat
rmmod diag

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.$$/
rm /tmp/*
rm -r /tmp/etc /tmp/log /tmp/lock /tmp/run /tmp/spool
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/
exec chroot /tmp/burn.$$ /bin/mtdkill write "${2#/tmp}" linux $3
