On Sat, Aug 01, 2009 at 09:04:55AM +0200, Ján ONDREJ (SAL) wrote: > On Fri, Jul 31, 2009 at 09:55:39PM +0200, Alexander Graf wrote: > > > > On 31.07.2009, at 20:19, Glauber Costa <glom...@redhat.com> wrote: > > > >> cp "$1" "$2" > >> +sum=$(echo "obase=8; $sum" | bc) > >> printf "\\$sum" | dd of="$2" bs=1 count=1 seek=$size conv=notrunc 2>/ > >> dev/null > > May be it's better to use awk: > > echo $sum | awk '{ printf("%c", $1) }' \ > | dd of="$2" bs=1 count=1 seek=$size conv=notrunc 2>/dev/null > > This version accepts decimal $sum, does not need conversion to octal.
Ane may be it's better to write whole checksum in awk, it's faster and cleaner. See attached patch (I am sorry, I don't know how to use git-email). SAL
diff --git a/pc-bios/optionrom/signrom.sh b/pc-bios/optionrom/signrom.sh index 4273d1f..065b6a9 100755 --- a/pc-bios/optionrom/signrom.sh +++ b/pc-bios/optionrom/signrom.sh @@ -18,28 +18,31 @@ # # Copyright Novell Inc, 2009 # Authors: Alexander Graf <ag...@suse.de> +# Jan Ondrej (SAL) <ondrejj(at)salstar.sk> # # Syntax: signrom.sh <input> <output> # did we get proper arguments? test "$1" -a "$2" || exit 1 -sum=0 - -# find out the file size -x=`dd if="$1" bs=1 count=1 skip=2 2>/dev/null | od -t u1 -A n` -#size=`expr $x \* 512 - 1` -size=$(( $x * 512 - 1 )) - -# now get the checksum -for i in `od -A n -t u1 -v "$1"`; do - # add each byte's value to sum - sum=$(( $sum + $i )) -done - -sum=$(( $sum % 256 )) -sum=$(( 256 - $sum )) - -# and write the output file -cp "$1" "$2" -printf "\\$sum" | dd of="$2" bs=1 count=1 seek=$size conv=notrunc 2>/dev/null +od -A n -t u1 -v "$1" | awk ' + BEGIN { + checksum=0 + # last byte will be replaced by checksum + last=-1 + } + { + # go over all record in row + for(i=1; i<=NF; i++) { + checksum+=$i + if (last>=0) { + printf "%c", last + } + last=$i + } + } + END { + # compute checksum + printf "%c", 256-(checksum%256) + } +' > $2