#!/bin/sh
# $Id: firstboot 3233 2006-02-13 13:13:40Z mbm $

rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)

dupe() { # <new_root> <old_root>
	cd $1
	echo -n "creating directories... "
	{
		cd $2 
		find . -xdev -type d
		echo "./dev ./jffs ./mnt ./proc ./tmp"
		# xdev skips mounted directories
		cd $1 
	} | xargs mkdir -p
	echo "done"

	echo -n "setting up symlinks... "
	for file in $(cd $2; find . -xdev -type f;); do
		case "$file" in
		"./rom/note") ;; #nothing
		"./etc/config"|\
		"./etc/resolv.conf"|\
		"./usr/lib/ipkg/info") cp -af $2/$file $file;;
		*) ln -sf /rom/${file#./*} $file;;
		esac
	done
	for file in $(cd $2; find . -xdev -type l;); do
		cp -af $2/${file#./*} $file
	done
	echo "done"
}

pivot() { # <new_root> <old_root>
	pivot_root $1 $1$2
	mount none /proc -t proc
	umount $2/proc
	mount -o move $2/dev /dev
	mount -o move $2/tmp /tmp
}

mountdp() { # <device> <mount_point> <ignored> <fs>
	mount $1 $2 -t $4
	dupe $2 $rom
	pivot $2 /rom
}

# script run by mount_root
[ "$1" = "ramoverlay" ] && {
	#1st stage
	mountdp none /mnt -t tmpfs
	exit 0
}

[ -z "$rom" ] && {
	echo "You do not have a squashfs partition; aborting"
	echo "(firstboot cannot be run on jffs2 based firmwares)"
	exit 1
}

[ "$1" = "switch2jffs" ] && {
	#2nd stage
	mtd erase OpenWrt
	mount -o remount,ro none / # try to avoid fs changing while copying
	mount -o bind / /mnt
	mount /dev/mtdblock/4 /rom/jffs -t jffs2
	echo -n "copying files ... "
	cp -a /mnt/* /rom/jffs
	umount /mnt
	echo "done"
	pivot /rom /mnt
	pivot /jffs /rom
	jffs2root --clean
	exit 0
}

# script run manually
[ \! -z "$jffs" ] && {
	echo "firstboot has already been run"
	echo "jffs2 partition is mounted, only resetting files"
	dupe $jffs $rom
	exit 0
}

mtd erase OpenWrt
mountdp /dev/mtdblock/4 /jffs -t jffs2
