#!/bin/sh

# call stack: magic_init -> tmpfs_init -> real_init -> magic_udev

# restore original init first
rm /sbin/init /sbin/magic_init
ln -s ../bin/busybox /sbin/init
sync

mkdir /new /old /put

# copy root to tmpfs
mount -t tmpfs -o size=512M none /new
mount -o bind / /old
cp -a /old/. /new/.

# uninstall PARTED from rootfs
rm -rf /PARTED/

# switch rootfs to tmpfs
cd /new
pivot_root . put
cd /

# --- tmpfs udev rule: ---
mkdir -p /etc/udev/rules.d
cat > /etc/udev/rules.d/magicmemory.rules << 'EOF'
KERNEL=="loop0", RUN+="/tmpfs_magic_udev"
EOF
# --- End of tmpfs udev rule. ---

# --- tmpfs_magic_udev: ---
cat > /tmpfs_magic_udev << 'EOF'
#!/bin/sh

rm /etc/udev/rules.d/magicmemory.rules

udev_quirks() {
    # udev kills slow scripts
    if [ "$SETSID" != "1" ]
    then
        SETSID=1 setsid "$0" "$@" &
        exit
    fi

    # udev might call twice
    mkdir /tmp/MagicMemory || exit
}

nickel_wait() {
    while sleep 1
    do
        pidof nickel && sleep 5 && break
    done
}

nickel_grab_env() {
    eval $(xargs -0 < /proc/$(pidof nickel)/environ)
    export $(xargs -0 < /proc/$(pidof nickel)/environ | sed -e 's@=[^ ]*@@g')
    cd / # PWD sanity
}

nickel_kill() {
    killall nickel
    killall sickel # 3.16.10 watchdog
    while sleep 1
    do
        pidof nickel || break
    done
}

progress_stop() {
    rm /tmp/magicmemory-progress*
}

progress() {
    local pid="$RANDOM$RANDOM"
    progress_stop
    touch /tmp/magicmemory-progress-"$pid"
    [ $PRODUCT != trilogy ] && PREFIX=$PRODUCT-
    local i=0
    while [ -e /tmp/magicmemory-progress-"$pid" ]
    do
        if [ "$1" == "black" ]
        then
            cat /dev/zero | /usr/local/Kobo/pickel showpic 1
        elif [ "$1" == "white" ]
        then
            tr '\x00' '\xff' < /dev/zero | /usr/local/Kobo/pickel showpic 1
        else
            i=$((($i+${1:-1})%11))
            zcat /etc/images/"$PREFIX"on-"$i".raw.gz | /usr/local/Kobo/pickel showpic 1
        fi

        sleep 3
     done
}

nuke() {
    progress 0 &
    sleep 999999
    exit
}

# Main:
udev_quirks
nickel_wait
nickel_grab_env
nickel_kill
umount /mnt/*
sync

# Resize user partition
progress 10 &

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    LD_LIBRARY_PATH=/PARTED/:.:"$LD_LIBRARY_PATH"
    /PARTED/parted -s /dev/mmcblk0 unit s resize 3 $start $newend || nuke
fi

# Done.
sync
reboot
sleep 9999
EOF
# --- End of tmpfs_magic_udev. ---
chmod +x /tmpfs_magic_udev

# --- tmpfs_magic_init: ---
cat > /tmpfs_magic_init << 'EOF'
#!/bin/sh

# umount mmc root
umount /put/new /put/old /put/put
rmdir /put/new /put/old /put/put
umount /new /old /put
rmdir /new /old /put

# continue with original init in tmpfs
exec /sbin/init "$@"
EOF
# --- End of tmpfs_magic_init. ---
chmod +x /tmpfs_magic_init

# run /tmpfs_magic_init
exec /tmpfs_magic_init
