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 |