#!/bin/sh
# Author: cedesmith
# License: GPL
# If you use my work please clearly and visibly mention it  
#
# Modified: Takaaki, boonbing
# https://bitbucket.org/takaaki/leo-initrd

echo "Init started"

# set PATH
OLD_PATH=$PATH
PATH=/bin:/sbin:/system/bin:/system/xbin
export PATH

# fail function
fail() {
    echo "$1"
    exit 1
}

# mount
echo "Mounting /proc"
mount -t proc proc /proc
echo "Mounting /sys"
mount -t sysfs sys /sys

# make devices
echo "Making devices"
mkdir -m 0777 /dev/block
mknod -m 0666 /dev/block/mmcblk0 b 179 0
mknod -m 0666 /dev/block/mmcblk0p1 b 179 1
mknod -m 0666 /dev/block/mmcblk0p2 b 179 2
mknod -m 0666 /dev/block/mmcblk0p3 b 179 3
mknod -m 0666 /dev/block/mmcblk0p4 b 179 4

mkdir -m 0777 /dev/input
mknod -m 0644 /dev/input/event0 c 13 64
mknod -m 0644 /dev/input/event1 c 13 65
mknod -m 0644 /dev/input/event2 c 13 66
mknod -m 0644 /dev/input/event3 c 13 67

mknod -m 0666 /dev/null c 1 3
mknod -m 0444 /dev/zero c 1 5
mknod -m 0644 /dev/ppp0 c 108 0
mknod -m 0644 /dev/smd0 c 253 0
mknod -m 0644 /dev/smd1 c 253 1

# wait for sdcard
while [ ! -b /dev/block/mmcblk0 ]; do
    echo "Waiting for SD Card"
    sleep 1
done
sleep 2


# mount /bootsdcard for install/update and in case system and data are image files not partitions 
# use loop_partition for backward compatibility
sdcard_partition=`grep -o '\bloop_partition=\w*' /proc/cmdline | sed 's/loop_partition=//'`
if [ "$sdcard_partition" = "" ]; then
    # assume single partition, if found partition 1 use that    
    sdcard_partition=mmcblk0
    [ -d /sys/block/mmcblk0/mmcblk0p1 ] && sdcard_partition=mmcblk0p1
fi
echo "Running an fsck on the SD card ($sdcard_partition)"
dosfsck -y /dev/block/$sdcard_partition
mkdir -m 0700 /bootsdcard
# mount sdcard with sync
# if system and data on partitions this will unmount so all cool
# if system and data on sdcard we can't have cached fs on cached fs as shutdown and reboot only call sync() once :)
mount -t vfat -o fmask=0111,dmask=0000,rw,utf8,noatime,nodiratime /dev/block/$sdcard_partition /bootsdcard
[ $? -eq 0 ] || echo "Failed to mount the SD card."

# set ANDROID_PATH for install/update and in case system and data are image files not partitions  
ANDROID_PATH=`grep -o '\brel_path=\w*' /proc/cmdline | sed 's/rel_path=//'`
[ "$ANDROID_PATH" = "" ] && ANDROID_PATH="/bootsdcard/Android" || ANDROID_PATH="/bootsdcard/$ANDROID_PATH"
export ANDROID_PATH

echo "Looking for image files in $ANDROID_PATH"
mknod -m 0666 /dev/block/loop0 b 7 0
mknod -m 0666 /dev/block/loop1 b 7 1
system_partition="loop0"
data_partition="loop1"

# losetup /dev/block/loop0 $ANDROID_PATH/system.ext4
# losetup /dev/block/loop1 $ANDROID_PATH/data.ext4
# search for system image on sdcard, create one if not found
    if [ ! -f $ANDROID_PATH/system.ext4 ]; then 
	
		# Creating sd-ext partition if any
		if [ -d $ANDROID_PATH/root/sd-ext ]; then
			
			# create system ext4 files according to sd ext folder sizes
			sdext_s_size=0
			sdext_s_size_mod=0
			sdext_s_size_buffer=20
			sdext_s_size=`printf '%2.0f\n' $(du -sh $ANDROID_PATH/root/sd-ext | cut -d'M' -f1)`
			let sdext_s_size_mod="$sdext_s_size+$sdext_s_size_buffer"
			dd if=/dev/zero of=$ANDROID_PATH/sdext_s.ext4 bs=1048576 count=$sdext_s_size_mod
			mke2fs -F -b 4096 $ANDROID_PATH/sdext_s.ext4
			
			data_s_size=0
			if [ -d $ANDROID_PATH/root/data ]; then
			
				# create system ext4 files according to data folder sizes
				data_s_size=`printf '%2.0f\n' $(du -sh $ANDROID_PATH/root/data | cut -d'M' -f1)`
			
			fi
			
			
			# Check Ported ROM system size
			system_size=0
			system_size_mod=0
			system_size_buffer=50
			system_size=`printf '%2.0f\n' $(du -sh $ANDROID_PATH/root/system | cut -d'M' -f1)`
			
			echo "Creating a new system image"
			let system_size_mod="$system_size+$sdext_s_size+$data_s_size+$system_size_buffer"
			dd if=/dev/zero of=$ANDROID_PATH/system.ext4 bs=1048576 count=$system_size_mod
			[ $? -eq 0 ] || fail "Failed to allocate the storage"
			mke2fs -F -b 4096 $ANDROID_PATH/system.ext4
			[ $? -eq 0 ] || fail "Failed to format the storage"
		
		else
		
			# Check Ported ROM system size
			system_size=0
			system_size_mod=0
			system_size_buffer=50
			system_size=`printf '%2.0f\n' $(du -sh $ANDROID_PATH/root/system | cut -d'M' -f1)`
			
			echo "Creating a new system image"
			let system_size_mod="$system_size+$system_size_buffer"
			dd if=/dev/zero of=$ANDROID_PATH/system.ext4 bs=1048576 count=$system_size_mod
			[ $? -eq 0 ] || fail "Failed to allocate the storage"
			mke2fs -F -b 4096 $ANDROID_PATH/system.ext4
			[ $? -eq 0 ] || fail "Failed to format the storage"
			
		fi
		
    fi
    losetup /dev/block/loop0 $ANDROID_PATH/system.ext4
    
    # search for data image on sdcard, create one if not found
    if [ ! -f $ANDROID_PATH/data.ext4 ]; then 
        echo "Creating a new Data store"
        data_size=`grep -o '\bdata_size=\w*' /proc/cmdline | sed 's/data_size=//'`
        [ -z $data_size ] && data_size="512"
        dd if=/dev/zero of=$ANDROID_PATH/data.ext4 bs=1048576 count=$data_size
        [ $? -eq 0 ] || fail "Failed to allocate the storage"
        mke2fs -F -b 4096 $ANDROID_PATH/data.ext4
        [ $? -eq 0 ] || fail "Failed to format the storage"
    fi
    losetup /dev/block/loop1 $ANDROID_PATH/data.ext4


# mount system image
echo "e2fsck on $system_partition"
e2fsck -y /dev/block/$system_partition
mount -t ext4 -o rw,noatime,nodiratime,sync /dev/block/$system_partition /system
[ $? -eq 0 ] || fail "Failed to mount /system"

# mount data image
echo "e2fsck on $data_partition"
e2fsck -y /dev/block/$data_partition
mount -t ext4 -o rw,noatime,nodiratime,sync /dev/block/$data_partition /data
[ $? -eq 0 ] || fail "Failed to mount /data"

# mount sd ext image if available
if [ -f $ANDROID_PATH/sdext_s.ext4 ]; then
	mknod -m 0666 /dev/block/loop10 b 7 10 && losetup /dev/block/loop10 $ANDROID_PATH/sdext_s.ext4
	e2fsck -y /dev/block/loop10
	mkdir -m 0755 /sd-ext && mount -t ext4 -o rw,noatime,nodiratime,sync /dev/block/loop10 /sd-ext
fi

# apply updates
if [ -d $ANDROID_PATH/update ]; then
    # update from zip package, Takaaki's method
    echo "Applying updates"
    valid_updates="build kernel app fix update"
    for update in $valid_updates; do
        find $ANDROID_PATH/update/ -maxdepth 1 -name "$update*.zip" -exec apply_update {} \;
    done
    [ -s $ANDROID_PATH/update-error.log ] || rm -f $ANDROID_PATH/update-error.log
    # update from shell scripts, cedesmith's method
    echo "Executing uninstall scripts"
    find "$ANDROID_PATH/update/" -maxdepth 1 -name "uninstall*.sh" -exec sh {} \;
    echo "Executing install scripts"
    find "$ANDROID_PATH/update/" -maxdepth 1 -name "install*.sh" -exec sh {} \;
fi

# install apps
if [ -d $ANDROID_PATH/AndroidApps ]; then
    echo "Install apps"
    # create app directory if not found
    [ ! -d /data/app ] && mkdir /data/app && chown 1000:1000 /data/app && chmod 0771 /data/app
    # copy to temporary directory so we can set owner and permisions ( can't do it on sdcard's fat )
    [ ! -d /data/app/tmp_copy_dir/ ] && mkdir /data/app/tmp_copy_dir
    cp $ANDROID_PATH/AndroidApps/* /data/app/tmp_copy_dir
    chown -R 1000:1000 /data/app/tmp_copy_dir
    # set permisions, 0644 for file, 0755 for directory
    find /data/app/tmp_copy_dir/ -type f -exec chmod 0644 {} \;
    find /data/app/tmp_copy_dir/ -type d -exec chmod 0755 {} \;
    # move apps to app directory
    mv -f /data/app/tmp_copy_dir/* /data/app
    # cleanup
    rm -rf /data/app/tmp_copy_dir
    rm -rf $ANDROID_PATH/AndroidApps
fi

# copy root directory
if [ -d $ANDROID_PATH/root/system ]; then
	# clear cache
	rm -rf /data/dalvik-cache/*
    rm -rf /data/.cache/* 
    echo "Update root directory"
	
	# CHECK FOR ALL-IN-ONE ROM INSTALLATION
	if [ -d $ANDROID_PATH/root/kernel ]; then
	
		# copy root direcotry
		cp -af $ANDROID_PATH/root/* /
		cp -af $ANDROID_PATH/root/META-INF /system
		if [ -f $ANDROID_PATH/root/kernel/boot/initrd.gz ]; then
		
			# Prepare default ROM initrd.gz
			cp -af $ANDROID_PATH/root/kernel/boot/initrd.gz /
			mkdir -m 0755 /temp
			cd /temp
			gzip -cd ../initrd.gz | cpio -i
			chmod 777 ./init.rc
			chmod 777 ./init.htcleo.rc
			
			# modify for SD Card Boot
			sed -i "s/service ril-daemon \/system\/bin\/rild/service ril-daemon \/system\/bin\/rild -l \/system\/lib\/libhtc_ril_wrapper.so/g" /temp/init.rc
			sed -i "s/on fs/#on fs/g" /temp/init.rc
			sed -i "s/on post-fs/#on post-fs/g" /temp/init.rc
			sed -i "s/on post-fs-data/#on post-fs-data/g" /temp/init.rc
			sed -i "s/user drm/user root/g" /temp/init.rc
			
			sed -i "s/on post-fs-data/on init\n mkdir \/data\/media 0775 media_rw media_rw\n chown media_rw media_rw \/data\/media/g" /temp/init.htcleo.rc
			
			sed -i "s/mount rootfs rootfs/#mount rootfs rootfs/g" /temp/init.rc
			sed -i "s/mount yaffs2/#mount yaffs2/g" /temp/init.rc
			sed -i "s/mount rootfs rootfs/#mount rootfs rootfs/g" /temp/init.htcleo.rc
			sed -i "s/mount yaffs2/#mount yaffs2/g" /temp/init.htcleo.rc
			rm -rf /initrd.gz
			
			# Prepare Portadroid initrd.gz
			cp -af $ANDROID_PATH/initrd.gz /
			mkdir -m 0755 /temp2
			cd /temp2
			gzip -cd ../initrd.gz | cpio -i
			cd /temp 
			cp -af cache init.rc init.htcleo.rc init.android logo.rle bootcomplete.htcleo.rc shutdown.htcleo.rc default.prop ueventd.htcleo.rc init.htcleo.usb.rc ueventd.rc vendor /temp2
			cd /temp2
			chmod 755 ./init.rc
			chmod 755 ./init.htcleo.rc
			rm -rf $ANDROID_PATH/initrd.gz
			find ./ | cpio -H newc -o | gzip > $ANDROID_PATH/initrd.gz
			rm -rf /initrd.gz
			rm -rf /temp
			rm -rf /temp2
		fi
		
		if [ -f $ANDROID_PATH/root/kernel/boot/zImage ]; then
			cp -af $ANDROID_PATH/root/kernel/boot/zImage $ANDROID_PATH
		fi
		
		# Use cLK for ppp data connection
		cp -af $ANDROID_PATH/root/clk/* /system
		
		# cleanup
		# rm -rf $ANDROID_PATH/root
		mv $ANDROID_PATH/root $ANDROID_PATH/root_tmp
		
		if [ ! -f $ANDROID_PATH/portadroid_nand.gz && ! -f $ANDROID_PATH/portadroid_desire.gz && ! -f $ANDROID_PATH/portadroid_sense.gz ]; then 
			find "$ANDROID_PATH/update/" -maxdepth 1 -name "update*.sh" -exec sh {} \;
		fi
	
	else
		# copy root direcotry
		cp -af $ANDROID_PATH/root/* /
		cp -af $ANDROID_PATH/root/META-INF /system
		if [ -f $ANDROID_PATH/root/boot/initrd.gz ]; then
		
			# Prepare default ROM initrd.gz
			cp -af $ANDROID_PATH/root/boot/initrd.gz /
			mkdir -m 0755 /temp
			cd /temp
			gzip -cd ../initrd.gz | cpio -i
			chmod 777 ./init.rc
			chmod 777 ./init.htcleo.rc
			
			# modify for SD Card Boot
			sed -i "s/service ril-daemon \/system\/bin\/rild/service ril-daemon \/system\/bin\/rild -l \/system\/lib\/libhtc_ril_wrapper.so/g" /temp/init.rc
			sed -i "s/on fs/#on fs/g" /temp/init.rc
			sed -i "s/on post-fs/#on post-fs/g" /temp/init.rc
			sed -i "s/on post-fs-data/#on post-fs-data/g" /temp/init.rc
			sed -i "s/user drm/user root/g" /temp/init.rc
			
			sed -i "s/on post-fs-data/on init\n mkdir \/data\/media 0775 media_rw media_rw\n chown media_rw media_rw \/data\/media/g" /temp/init.htcleo.rc
			
			sed -i "s/mount rootfs rootfs/#mount rootfs rootfs/g" /temp/init.rc
			sed -i "s/mount yaffs2/#mount yaffs2/g" /temp/init.rc
			sed -i "s/mount rootfs rootfs/#mount rootfs rootfs/g" /temp/init.htcleo.rc
			sed -i "s/mount yaffs2/#mount yaffs2/g" /temp/init.htcleo.rc
			rm -rf /initrd.gz
			
			# Prepare Portadroid initrd.gz
			cp -af $ANDROID_PATH/initrd.gz /
			mkdir -m 0755 /temp2
			cd /temp2
			gzip -cd ../initrd.gz | cpio -i
			cd /temp 
			cp -af cache init.rc init.htcleo.rc init.android logo.rle bootcomplete.htcleo.rc shutdown.htcleo.rc default.prop ueventd.htcleo.rc init.htcleo.usb.rc ueventd.rc vendor /temp2
			cd /temp2
			chmod 755 ./init.rc
			chmod 755 ./init.htcleo.rc
			rm -rf $ANDROID_PATH/initrd.gz
			find ./ | cpio -H newc -o | gzip > $ANDROID_PATH/initrd.gz
			rm -rf /initrd.gz
			rm -rf /temp
			rm -rf /temp2
		fi
		
		if [ -f $ANDROID_PATH/root/boot/zImage ]; then
			cp -af $ANDROID_PATH/root/boot/zImage $ANDROID_PATH
		fi
		
		# cleanup
		# rm -rf $ANDROID_PATH/root
		mv $ANDROID_PATH/root $ANDROID_PATH/root_tmp
		
		if [ ! -f $ANDROID_PATH/portadroid_nand.gz && ! -f $ANDROID_PATH/portadroid_desire.gz && ! -f $ANDROID_PATH/portadroid_sense.gz ]; then 
			find "$ANDROID_PATH/update/" -maxdepth 1 -name "update*.sh" -exec sh {} \;
		fi
	fi
fi

# copy default portadroid files to ported ROM
if [ -f $ANDROID_PATH/portadroid_nand.gz ]; then
	cp -af $ANDROID_PATH/portadroid_nand.gz /system
	cd /system
	gzip -cd ./portadroid_nand.gz | cpio -i -u
	rm -rf $ANDROID_PATH/portadroid_nand.gz
	rm -rf /system/portadroid_nand.gz
	chmod 6755 /system/bin/su
	chmod 6755 /system/xbin/su
	chmod 755 /system/bin/busybox
	chmod 755 /system/xbin/busybox
	chmod 4755 /system/xbin/cssync
	cd /system/xbin
	./busybox --install -s /system/xbin
	
	# run updates script
	if [ -d $ANDROID_PATH/update ]; then
		# update from shell scripts, cedesmith's method
		echo "Executing update scripts"
		find "$ANDROID_PATH/update/" -maxdepth 1 -name "update*.sh" -exec sh {} \;
		# rm -rf $ANDROID_PATH/update
		# mv $ANDROID_PATH/update $ANDROID_PATH/update_tmp
	fi
	
elif [ -f $ANDROID_PATH/portadroid_desire.gz ]; then
	cp -af $ANDROID_PATH/portadroid_desire.gz /system
	cd /system
	gzip -cd ./portadroid_desire.gz | cpio -i -u
	rm -rf $ANDROID_PATH/portadroid_desire.gz
	rm -rf /system/portadroid_desire.gz
	chmod 6755 /system/bin/su
	chmod 6755 /system/xbin/su
	chmod 755 /system/bin/busybox
	chmod 755 /system/xbin/busybox
	chmod 4755 /system/xbin/cssync
	cd /system/xbin
	./busybox --install -s /system/xbin
	
	# run updates script
	if [ -d $ANDROID_PATH/update ]; then
		# update from shell scripts, cedesmith's method
		echo "Executing update scripts"
		find "$ANDROID_PATH/update/" -maxdepth 1 -name "update*.sh" -exec sh {} \;
		# rm -rf $ANDROID_PATH/update
		# mv $ANDROID_PATH/update $ANDROID_PATH/update_tmp
	fi
	
elif [ -f $ANDROID_PATH/portadroid_sense.gz ]; then

	# run updates script
	if [ -d $ANDROID_PATH/update ]; then
		# update from shell scripts, cedesmith's method
		echo "Executing update scripts"
		find "$ANDROID_PATH/update/" -maxdepth 1 -name "update*.sh" -exec sh {} \;
		# rm -rf $ANDROID_PATH/update
		# mv $ANDROID_PATH/update $ANDROID_PATH/update_tmp
	fi
	
	cp -af $ANDROID_PATH/portadroid_sense.gz /system
	cd /system
	gzip -cd ./portadroid_sense.gz | cpio -i -u
	rm -rf $ANDROID_PATH/portadroid_sense.gz
	rm -rf /system/portadroid_sense.gz
	
	updater_script="/META-INF/com/google/android/updater-script"
	# set permissions
	 grep "set_perm_recursive" $updater_script | grep -v "tmp" | grep -v "recovery" | \
	 while read LINE; do
		 PERM=`echo $LINE | sed 's/set_perm_recursive(//g' | sed 's/);//g' | sed 's/"//g' | sed 's/ //g'`
		 USER=`echo $PERM | cut -d',' -f1`;
		 GROUP=`echo $PERM | cut -d',' -f2`;
		 DIR_PERM=`echo $PERM | cut -d',' -f3`;
		 FILE_PERM=`echo $PERM | cut -d',' -f4`;
		 TARGET=`echo $PERM | cut -d',' -f5`;
		 echo -n "Setting permissions for $TARGET... "
		 chown -R $USER:$GROUP /$TARGET
		 chmod -R $DIR_PERM /$TARGET
		 find /$TARGET -type f -exec chmod $FILE_PERM {} \; && echo "done"
	 done
	 grep "set_perm" $updater_script | grep -v "recursive" | grep -v "tmp" | grep -v "recovery" | \
	 while read LINE; do
		 PERM=`echo $LINE | sed 's/set_perm(//g' | sed 's/);//g' | sed 's/"//g' | sed 's/ //g'`
		 USER=`echo $PERM | cut -d',' -f1`;
		 GROUP=`echo $PERM | cut -d',' -f2`;
		 FILE_PERM=`echo $PERM | cut -d',' -f3`;
		 TARGET=`echo $PERM | cut -d',' -f4`;
		 echo -n "Setting permissions for $TARGET... "
		 chown $USER:$GROUP /$TARGET
		 chmod $FILE_PERM /$TARGET && echo "done"
	 done
	
	cd /system
	chown 0:0 init.rc init.htcleo.rc bootcomplete.htcleo.rc shutdown.htcleo.rc default.prop
	chmod 0750 init.rc init.htcleo.rc
	chmod 0644 bootcomplete.htcleo.rc shutdown.htcleo.rc default.prop
	
fi

# execute build specific init scripts (with sh so x permission don't mather)
find /system -maxdepth 1 -name "init*.sh" -exec sh '{}' \;

# set lcd density
lcd_density=`grep -o '\blcd_density=\w*' /proc/cmdline | sed 's/lcd_density=//'`
[ -z $lcd_density ] && lcd_density="240"
current_lcd_density=`awk -F"=" '/lcd_density/ {print $2}' /default.prop`
if [ "$current_lcd_density" == "" ]; then
    echo "ro.sf.lcd_density=$lcd_density" >> /default.prop
elif [ "$lcd_density" != "$current_lcd_density" ]; then
    sed -i "s/ro.sf.lcd_density=$current_lcd_density/ro.sf.lcd_density=$lcd_density/g" /default.prop
fi
# set gps zone
gps_zone=`grep -o '\bgps_zone=\w*' /proc/cmdline | sed 's/gps_zone=//'`
[ -z $gps_zone ] && gps_zone="us"
current_gps_zone=`awk -F"=" '/NTP_SERVER/ {print $2}' /system/etc/gps.conf`
if [ "$gps_zone.pool.ntp.org" != "$current_gps_zone" ]; then
    sed -i "s/$current_gps_zone/$gps_zone.pool.ntp.org/g" /system/etc/gps.conf
fi

# set cache if not already set
# put in on /data and not sdcard as it supports permisions
# if concerned about space used make a bigger data.ext4
if [ ! -d /data/.cache ];then
    mkdir -m 0770 /data/.cache
    chown 1000:2001 /data/.cache
fi
ln -s /data/.cache /cache

# reboot if need
if [ -f $ANDROID_PATH/reboot ]; then
    echo "Rebooting in 5 seconds..."
    rm -f $ANDROID_PATH/reboot 
    umount /bootsdcard
	umount /system
	umount /data
	umount /sd-ext
    sleep 5
    /system/bin/toolbox reboot
fi

#by KAI 25.11.2011 always dual mount
echo /dev/block/mmcblk0 > /sys/devices/platform/usb_mass_storage/lun0/file

# move init files to /system
init_files="init.rc init.htcleo.rc bootcomplete.htcleo.rc shutdown.htcleo.rc default.prop ueventd.rc"
for init_file in $init_files; do
    if [ -f /$init_file ]; then
        cp -a /$init_file /system/$init_file
    fi
    if [ -f /system/$init_file ]; then        
        [ -f /$init_file ] && rm -f /$init_file
        ln -s /system/$init_file /$init_file
    fi
done

# copy system to RAM
# ram_system=`grep -o '\bram_system=\w*' /proc/cmdline | sed 's/ram_system=//'`
system_size=`printf '%2.0f\n' $(du -sh /system | cut -d'M' -f1)`
system_app_size=`printf '%2.0f\n' $(du -sh /system/app | cut -d'M' -f1)`
system_lib_size=`printf '%2.0f\n' $(du -sh /system/lib | cut -d'M' -f1)`
system_framework_size=`printf '%2.0f\n' $(du -sh /system/framework | cut -d'M' -f1)`
if [ ! -f $ANDROID_PATH/SD_Boot ]; then
	if [ ! -f $ANDROID_PATH/sdext_s.ext4 ]; then
		
		if [ "$system_size" -le 200 ]; then
			# create boot system
			mknod -m 0666 /dev/block/loop9 b 7 9 && losetup /dev/block/loop9 $ANDROID_PATH/system.ext4
			mkdir -m 0755 /bootsystem && mount -t ext4 -o rw,noatime,nodiratime,sync /dev/block/loop9 /bootsystem
			[ $? -eq 0 ] || fail "Failed to mount /bootsystem"
			# create ram system
			# system_size=`printf '%2.0f\n' $(du -sh /bootsystem | cut -d'M' -f1)`
			dd if=/dev/zero of=/system.ext4 bs=1048576 count=100 && mke2fs -F /system.ext4
			[ $? -eq 0 ] || fail "Failed to format the storage"
			# replace system image
			umount /system
			[ $? -eq 0 ] || fail "Failed to umount /system"
			losetup -d /dev/block/loop0 && losetup /dev/block/loop0 /system.ext4 && e2fsck -y /dev/block/loop0
			mount -t ext4 -o rw,noatime,nodiratime,sync /dev/block/loop0 /system
			
			system_test_size_150MB=0
			system_test_size_200MB=0
			let system_test_size_150MB="$system_size-$system_app_size-$system_lib_size"
			let system_test_size_200MB="$system_size-$system_app_size-$system_lib_size-$system_framework_size"
			
			if [ "$system_size" -le 100 ]; then
				cd /bootsystem && cp -a app bin customize etc fonts framework lib usr xbin tts vendor ppp lost* *prop init* /system && cd /
				ln -s /bootsystem/media /system/media
			elif [ "$system_test_size_150MB" -le 100 ]; then
				cd /bootsystem && cp -a bin customize etc fonts framework usr xbin tts vendor ppp lost* *prop init* /system && cd /
				ln -s /bootsystem/app /system/app
				ln -s /bootsystem/lib /system/lib
				ln -s /bootsystem/media /system/media
			elif [ "$system_test_size_200MB" -le 100 ]; then
				cd /bootsystem && cp -a bin customize etc fonts usr xbin tts vendor ppp lost* *prop init* /system && cd /
				ln -s /bootsystem/app /system/app
				ln -s /bootsystem/framework /system/framework
				ln -s /bootsystem/lib /system/lib
				ln -s /bootsystem/media /system/media
			fi
		fi
	fi
fi




# cleanup
#umount /bootsdcard
#[ $? -eq 0 ] && rm -f /bootsdcard
# delete /bin to free ram
rm -rf /bin
ln -s /system/bin /bin
# restore old PATH
PATH=$OLD_PATH
export PATH

# execute android init 
echo "Init ended"
exec /init.android
