#!/bin/sh

getarg()
{
	grep -q " $1=" /proc/cmdline || return 1
	eval $2=$(sed "s/.* $1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)
	return 0
}

copy_rootfs()
{
	total=$(grep MemTotal /proc/meminfo | sed 's/[^0-9]//g')
	need=$(du -c ${path}rootfs* | tail -n 1 | cut -f1)
	[ $(( $total / $need )) -gt 1 ] || return 1
	if ! grep -q " keep-loram" /proc/cmdline && cp ${path}rootfs* /mnt; then
		path=/mnt/
		return 0
	else
		rm -f /mnt/rootfs*
		return 1
	fi
}

release=4.0
echo "Switching / to tmpfs..."
mount -t proc proc /proc
size="$(grep rootfssize= < /proc/cmdline | \
	sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
[ -n "$size" ] || size="-o size=90%"

if [ -x /bin/httpfs ]; then	# loram-http

mount -t sysfs sysfs /sys
for i in /lib/*.ko.gz ; do
	for j in $(unlzma < $i |grep alias=pci: |sed 's/alias//;s/\*/.*/g'); do
		grep -q "$j" /sys/bus/pci/devices/*/uevent || continue
		for k in $(cat ${i/ko.gz/dep} 2> /dev/null); do
			insmod /lib/$k.ko.gz 2> /dev/null
		done
		insmod $i 2> /dev/null
		break
	done
done
umount /sys
while read var default; do
	eval $var=$default
	getarg $var $var
done <<EOT
eth	eth0
dns	208.67.222.222,208.67.220.220
netmask	255.255.255.0
gw
ip
EOT
if [ -n "$ip" ]; then
	ifconfig $eth $ip netmask $netmask up
	route add default gateway $gw
	for i in $(echo $dns | sed 's/,/ /g'); do
		echo "nameserver $i" >> /etc/resolv.conf
	done
else
	ifconfig $eth 0.0.0.0 up
	udhcpc -f -q -s /lib/udhcpc -i $eth
fi
for i in mirror.switch.ch/ftp/mirror/slitaz download.tuxfamily.org/slitaz \
	 mirror1.slitaz.org mirror.slitaz.org ; do
	[ -n "$URLISO" ] && URLISO="$URLISO,"
	URLISO="${URLISO}http://$i/iso/$release/flavors/slitaz-loram-cdrom.iso,http://$i/iso/$release/flavors/slitaz-$release-loram-cdrom.iso"
done
getarg urliso URLISO
DIR=fs
if getarg loram DIR; then
	DEVICE=${DIR%,*}
	DIR=/${DIR#*,}
fi
mount -t tmpfs $size tmpfs /mnt
path2=/mnt/.httpfs/
path=/mnt/.cdrom/
mkdir -p /mnt/.rw $path $path2
while [ ! -d $path/boot ]; do
	for i in $(echo $URLISO | sed 's/,/ /g'); do
		httpfs $i $path2 && break
	done
	mount -o loop,ro -t iso9660 $path2/*.iso $path
done
#copy_rootfs && umount -d $path && umount -d $path2

elif [ -f $(echo /rootfs*.gz | cut -f1 -d' ') ]; then	# loram-ram

total=$(grep MemTotal /proc/meminfo | sed 's/[^0-9]//g')
free=$(grep MemFree /proc/meminfo | sed 's/[^0-9]//g')
if [ $(( $total/$free )) -gt 1 ] || ! mount -t tmpfs $size tmpfs /mnt; then
	echo "No tmpfs for /mnt"
	mkdir -p /mnt/.rw
	mount -t tmpfs tmpfs /mnt/.rw
	mkdir -p /mnt/.rw/mnt/.rw
	path=/
else
	mkdir -p /mnt/.rw
	path=/mnt/.
	for i in rootfs* ; do
		mv /$i $path$i 
	done
fi

else				# loram-cdrom

getarg cdrom DRIVE_NAME ||
DRIVE_NAME=$(grep "drive name" < /proc/sys/dev/cdrom/info | cut -f 3)
DEVICE=/dev/$DRIVE_NAME
DIR=fs
if getarg loram DIR; then
	DEVICE=${DIR%,*}
	DIR=/${DIR#*,}
fi
mount -t tmpfs $size tmpfs /mnt
mkdir -p /mnt/.rw /mnt/.cdrom /mnt/mnt/.cdrom
i=0
while [ $i -lt 5 ] && ! mount -r $DEVICE /mnt/.cdrom; do
	case "$DEVICE" in
	/dev/sd*|UUID=*|LABEL=*)
		mount -t sysfs sysfs /sys
		USBDELAY=$(cat /sys/module/usb_storage/parameters/delay_use)
		umount /sys
		sleep $((1+$USBDELAY)) ;;
	esac
	i=$((i+1))
done
path=/mnt/.cdrom/
copy_rootfs && umount -d /mnt/.cdrom

fi

memfree=$(grep MemFree /proc/meminfo | sed 's/[^0-9]//g')
umount /proc
branch=br=/mnt/.rw:/mnt/.cdrom/$DIR
if [ ! -d /mnt/.cdrom/$DIR/etc ]; then
branch=br=/mnt/.rw
for i in ${path}rootfs* ; do
	fs=${i#*root}
	branch=$branch:/mnt/.$fs
	mkdir -p /mnt/.rw/mnt/.$fs /mnt/.$fs /mnt/.rw/mnt/.cdrom
	if [ -f /bin/cromfs-driver ]; then
		cromfs-driver ${path}root$fs /mnt/.$fs -o ro,dev,suid,allow_other
	else
		insmod /lib/squashfs.ko.gz 2> /dev/null
		mount -o loop,ro -t squashfs ${path}root$fs /mnt/.$fs
	fi
done
else
mkdir -p /mnt/.rw/mnt/.httpfs
fi
insmod /lib/aufs.ko.gz
mount -t aufs -o $branch none /mnt
[ $memfree -lt 30000 ] && sed -i 's/ slim//' /mnt/etc/rcS.conf
[ -x /mnt/sbin/init ] && exec /bin/switch_root mnt /sbin/init || sh
