#!/bin/sh

readheaders() {
	while read h; do
		echo $h;
		if [ "$h" = $'\r' ]; then return; fi
	done
}

rxfile() {
	echo "Processing $1..."

	# Find root NBD num, and corresponding root NBD num's SD lun num 
	nbd=`sed '/ \/mnt\/root /!d;s/ .*/;;s/.*.nbd\(.\).*/\1/' < /proc/mounts`
	if [ -z "$nbd" ]; then nbd=0; fi
	eval `sdctl --stats`
	x=`sed '/lun/!d;s/lun//;s/:.*//' < /proc/${nbdpid}/cmdline`
	if [ "$x" -eq 1 ]; then
		if [ $nbd -eq 0 ]; then lun=1; else lun=0; fi 
	else
		if [ $nbd -eq 0 ]; then lun=0; else lun=1; fi 
	fi

	# LUN#/NBD# overrides in file name
	case $1 in
	*nbd0*)
		nbd=0
		;;
	*nbd1*)
		nbd=1
		;;
	*lun0*)
		lun=0
		;;
	*lun1*)
		lun=1
		;;
	esac

	case $1 in
	init|ko.tar.bz2|ts${MODEL}-fpga.vme.bz2)
		mount -o remount,rw /mnt/root
		mkdir /mnt/root/ts
		cat > /mnt/root/ts/$1
		chmod +x /mnt/root/ts/$1
		mount -o remount,ro /mnt/root
		;;
	*.vme.bz2)	
		rxfile ts${MODEL}-fpga.vme.bz2
		;;
	*.bz2)
		bunzip2 -c - | rxfile "${1%.bz2}"
		;;
	*.gz)
		gunzip -c - | rxfile "${1%.gz}"
		;;
	Image|zImage|kernel*.dd)
		eval `sdctl --lun $lun -k kernel -i - -z 65536 2>&1`
		let part1_sz="$write_kb * 2"
		export part1_sz
		sdctl --lun $lun --setmbr 2>&1
		blockdev --rereadpt /dev/nbd${nbd}
		;;
	root*.dd)
		r=`sed '/ \/mnt\/root /!d;s/ .*//' < /proc/mounts`
		if [ -z "$r" ]; then r="/dev/nbd${nbd}p2"; fi
		if [ ! -e "$r" ]; then r="/dev/null"; fi
		if [ -f /r ]; then read r < /r; fi
		echo "$r" > /r
		umount /mnt/root
		sdpart=`echo $r | sed "/^\/dev\/nbd${nbd}p[0-9]/!d;s/\/dev\/nbd${nbd}p/part/"`
		if [ -n "$sdpart" ]; then
			sdctl --lun $lun -k $sdpart -i - -z 65536 2>&1
		else
			cat >/dev/null
		fi
		;;
	mbr|mbr.dd|mbr*.dd)
		umount /mnt/root
		kernel=`fdisk -l /dev/nbd${nbd} | sed '/da U/!d;s/ .*//;q'`
		cat $kernel > /tmp/kernel
		cat > /dev/nbd${nbd}
		blockdev /dev/nbd${nbd} --rereadpt
		kernel=`fdisk -l /dev/nbd${nbd} | sed '/da U/!d;s/ .*//;q'`
		cat /tmp/kernel > $kernel
		fdisk -l /dev/nbd${nbd} | sed '/83 L/!d;s/ .*//;q' > /r
		rm /tmp/kernel
		sync
		;;
	*.img)
		umount /mnt/root
		sdctl --lun $lun -i - -z 65536 2>&1
		blockdev /dev/nbd${nbd} --rereadpt
		;;
	*.dd)
		umount /mnt/root
		sdctl --lun $lun --dblstor-disable -i - -z 65536 2>&1
		blockdev /dev/nbd${nbd} --rereadpt
		;;
	*.sh)
		cat >/tmp/$1
		chmod +x /tmp/$1
		/tmp/$1
		rm /tmp/$1
		;;
	*.bin)
		cat $1 /dev/zero | /mnt/root/bin/dd bs=1M count=1 conv=swab | spiflashctl -OW 0x100 -z 4096 -k part3 -i -
		echo "$1 Installed.  Reboot to load bitstream."
		;;
	root*.tar)
		mount -o remount,rw,async /mnt/root
		cd /mnt/root
		rm -rf *
		s=`date +%s`
		tar -x -f -
		e=`date +%s`
		k=`df -k /mnt/root | sed '/mnt\/root/!d;s/[^ ]* *[^ ]* *\([^ ]*\).*/\1/'`
		let k="$k / ($e - $s)"
		echo "Speed: $k kbps"
		cd /
		mount -o remount,ro /mnt/root
		;;
	src*.tar)
		mount -o remount,rw,async /mnt/root
		mkdir -p /mnt/root/ts
		cd /mnt/root/ts
		tar -x -f -
		export PATH=/bin:/sbin:/mnt/root/bin:/mnt/root/sbin:/usr/bin:/usr/sbin
		if [ -f Makefile ] ; then make; fi
		cd /
		mount -o remount,ro /mnt/root
		;;
	*.c|*.C|*.cpp)
		mount -o remount,rw,async /mnt/root
		mkdir -p /mnt/root/ts
		cat > /mnt/root/ts/$1
		export PATH=/bin:/sbin:/mnt/root/bin:/mnt/root/sbin:/usr/bin:/usr/sbin
		out=`echo $1 | sed 's/\..*//'`
		cd /mnt/root/ts
		gcc -o $out -Wall $1
		cd /
		mount -o remount,ro /mnt/root
		killall $out
		if [ -x /mnt/root/ts/$out ]; then /mnt/root/ts/$out; fi
		;;
	*)
		mount -o remount,rw,async /mnt/root
		cat > /mnt/root/ts/$1
		chmod +x /mnt/root/ts/$1
		mount -o remount,ro /mnt/root
		;;
	esac
	echo "$1 ok" 
}

echo "Content-Type: text/plain"
echo

read delim
while true; do
	f=`readheaders | sed '/tsfile/!d;s/.*ilename="\([^"]*\)".*/\1/;q'`
	if [ -n "$f" ]; then
		cat2 "$delim" | rxfile "$f"
		break
	fi
	while true; do
		read l
		if [ $? -ne 0 ]; then break 2; fi
		if [ "$l" = "$delim" ]; then break; fi
	done
done

