wok-tiny annotate linux/stuff/pack @ rev 139

linux: pack setup
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Jul 01 10:56:29 2018 +0200 (2018-07-01)
parents
children d71bd8881bcd
rev   line source
pascal@139 1 #!/bin/sh
pascal@139 2
pascal@139 3 ddq()
pascal@139 4 {
pascal@139 5 dd "$@" 2> /dev/null
pascal@139 6 }
pascal@139 7
pascal@139 8 word()
pascal@139 9 {
pascal@139 10 n=$1; for i in $(seq 1 1 ${2:-2}); do
pascal@139 11 printf '\\\\x%02X' $(($n & 255))
pascal@139 12 n=$(($n >> 8))
pascal@139 13 done | xargs echo -en
pascal@139 14 }
pascal@139 15
pascal@139 16 store()
pascal@139 17 {
pascal@139 18 word $2 "$4" | ddq bs=1 conv=notrunc of="$3" seek=$(($1))
pascal@139 19 }
pascal@139 20
pascal@139 21 get()
pascal@139 22 {
pascal@139 23 echo $(od -j $(($1)) -N ${3:-2} -t u${3:-2} -An "$2")
pascal@139 24 }
pascal@139 25
pascal@139 26 if which lz4 > /dev/null ; then
pascal@139 27
pascal@139 28 # boot + head param
pascal@139 29 param=$((514+$(get 0x201 $1 1)))
pascal@139 30 ddq if=$1 bs=1 count=$param > /tmp/setup$$
pascal@139 31
pascal@139 32 # unlz4 + data
pascal@139 33 ddq if=unpacklz4.bin >> /tmp/setup$$
pascal@139 34 setupsz=$(get 0x1F1 $1 1)
pascal@139 35 ddq if=$1 bs=1 skip=$param count=$(($setupsz*512-$param+512)) | \
pascal@139 36 lz4 -l -12 | ddq bs=4 skip=1 >> /tmp/setup$$
pascal@139 37
pascal@139 38 # version string
pascal@139 39 word $(get 0x20E $1) >> /tmp/setup$$
pascal@139 40 word $setupsz 1 >> /tmp/setup$$
pascal@139 41 versionofs=
pascal@139 42 version="$(ddq if=$1 bs=1 skip=$((0x200+$(get 0x20E $1))) | strings | sed q)"
pascal@139 43 if grep --help 2>&1 | grep -q byte-offset; then
pascal@139 44 versionofs=$(grep -obaF "$version" /tmp/setup$$ | sed 's/:.*//')
pascal@139 45 fi
pascal@139 46 if [ -z "$versionofs" ]; then
pascal@139 47 versionofs=$(stat -c %s /tmp/setup$$)
pascal@139 48 echo -en "$version\0" >> /tmp/setup$$
pascal@139 49 fi
pascal@139 50 store 0x20E $(($versionofs-512)) /tmp/setup$$
pascal@139 51
pascal@139 52 helpersz=0
pascal@139 53 [ -n "$2" ] && helpersz=$(stat -Lc %s "$2")
pascal@139 54 newsetupsz=$((($(stat -c %s /tmp/setup$$)+$helpersz-1)/512))
pascal@139 55 [ $newsetupsz -lt 4 ] && newsetupsz=4
pascal@139 56 store 0x1F1 $newsetupsz /tmp/setup$$ 1
pascal@139 57
pascal@139 58 if [ $newsetupsz -lt $setupsz ]; then
pascal@139 59 ddq of=/tmp/setup$$ bs=512 seek=$(($newsetupsz+1)) count=0
pascal@139 60 [ -n "$2" ] && ddq if="$2" bs=1 of=/tmp/setup$$ \
pascal@139 61 seek=$((512 + 512*$newsetupsz - $helpersz))
pascal@139 62 [ -n "$3" ] && [ $(stat -Lc %s "$3") -eq 497 ] &&
pascal@139 63 ddq if="$3" conv=notrunc of=/tmp/setup$$
pascal@139 64 ddq if=$1 bs=512 skip=$((1+$setupsz)) >> /tmp/setup$$
pascal@139 65 cp /tmp/setup$$ $1
pascal@139 66 fi
pascal@139 67 rm -f /tmp/setup$$
pascal@139 68
pascal@139 69 fi