#!/bin/sh

[ -s "$1" -a "$2" ] || {
       cat << EOT
Usage: $0 zImage-to-read bzImage-to-create [version-string]
EOT
       exit 1
}

ddq()
{
       dd "$@" 2> /dev/null
}

get()
{
       echo $( od -v -j $(($1)) -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} \
               -An $2 2>/dev/null )
}

store()
{
       n=$3; for i in $(seq 8 8 $1); do
               printf '\\\\x%02X' $(($n & 255))
               n=$(($n >> 8))
       done | xargs echo -en | ddq bs=1 conv=notrunc of=$4 seek=$(($2))
}

create_bzImage()
{
       ddq bs=512 count=1 of=$1
       [ "$(od -j 486 $1 -An -N 4 -a|sed 's/ //g')" == "ELKS" ] && iselks=1
       [ " $(get 0x3F $1 2)" == " 15080" ] && islinux001=1 && cp $1 $1$$
       # from http://hg.slitaz.org/wok/file/7184ec55b1aa/linux/stuff/linux-header.u
       uudecode <<EOT | ddq of=$1 conv=notrunc
begin-base64 644 -
TVrrIEAAAAACAAAQ//8ACASeAABfAvD/TmV4dCEHDQA/owCeUuiwAZkfoPF9
QA+hxXd4XwZXsQbzpRYfZGaPR3jGRfg/+pdYQejIAL4AAoFMECCAxkQlm+hv
AVuJ5v9IEMdAFAiTgPMIdfOhFQJmix70AWZLZsHrBWZDvwAQOcd1AzWAFolE
G2a/gAAAAGYp+5xzAgHfUFZTMdtoAIAH6GEAW16MwbSHFgfNFVgFAAEQTB+/
gAedd8WITB/GRBwQx0QTgAa0h80Vl80T6gAAIJBaOMF3NGDNE/noeABhUlAo
yHcCsAE5+HICifhQtALNE1pYctyVAdGO6QDXANcp11p0UozplTjBddSIyLEB
MM51zP7FgP1QdcW1AGC+GABT6KoAW+g+AHUVUpjNE7gBAs0TWtDUOmT+depG
SHXm650x0ugAAAYftD+J+cHhCInrzSGSFh+wMRwDtA67BwDNEDwNdPPDv2wE
ZMYFprgNAWQ6JXQKzRZ09JjNFo7nR8PoVgCg0QJAvoAAigxG86SXgHz/P77g
AnQyDwHgJAF1K45fLEM5D3X7jVcEtD3NIXInleiM/4AGoAA9uwICOV8EcgXH
RyeeCR5qTMsDdA6wDeiH/6w8AH/4w16/xp1oAJAXifwWBzHAuTsA86pPW1bD
AA==
====
EOT
       # from tobzimage.S
       uudecode <<EOT | gunzip >> $1
begin-base64 644 -
H4sIAG2wX1cCA3ut4pFSFMzAxAACAgyMQNgAYqCCOXxZDAmG/9OOs35emnhe
LnwfB9NabpYS5v8x/wy/9d1L+1/Cote5pI6hoYb9Q7HmcReWVIYeH7Y5Ef+O
BMz9n5MSJtf5zOxoCUujzVlJ+bjSfWA9/S4pexgYgBSLmHzn452cDGGP/u5g
nDwzICwobIEYE5DayAEU2s/A1B36RYy989lOhoYt7WdF/7uI/HeRaXzFIFD+
tvmIwU4GxteCHfnifQfDDf8bftvK9nlpPJv8PgaWf74fX7MfY3cy/P95aVfu
x9MMWEGVZ25ieirDiAUAs6tFkQACAAA=
====
EOT
       s="$2"
       [ -s "$s" ] && s="$(cat "$s")"
       [ -z "$s" ] && s="$(basename "$1")"
       echo -e "\n$s" | tr '\n' '\r' | cat - /dev/zero | \
       ddq conv=notrunc of=$1 bs=1 seek=768 count=255
       setupsz=$(get 497 $1 1)
       [ $setupsz -eq 0 ] && setupsz=4
       if [ "$islinux001" == "1" ]; then
               cat $1$$ /dev/zero | ddq bs=512 count=$setupsz >> $1
               rm -f $1$$
       else
               ddq bs=512 count=$setupsz >> $1
               if [ "$(od -j 1026 $1 -An -N 4 -a|sed 's/ //g')" == "HdrS" ] &&
                  [ $(($(get 1041 $1 1) & 1)) -eq 1 ]; then
                       echo "Already a bzImage file, abort."
                       rm -f $1
                       exit 1
               fi
       fi
       store 8 497 $(($setupsz+1)) $1
       syssz=$(get 500 $1 2)
       [ $syssz -eq 0 ] && syssz=$((($filesz+15-512)/16-($setupsz*32)))
       [ "$islinux001" == "1" ] && syssz=$((($filesz+15-512)/16))
       store 16 500 $syssz $1
       [ "$iselks" == "1" ] && store 16 708 37008 $1
       [ "$islinux001" == "1" ] && store 16 733 37008 $1
       ddq >> $1
}

filesz=$(stat -c %s $1)
create_bzImage $2 "$3" < $1