qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] signrom.sh and MinGW


From: Sebastian Herbszt
Subject: Re: [Qemu-devel] signrom.sh and MinGW
Date: Sun, 2 Aug 2009 21:56:56 +0200

Alexander Graf wrote:

On 02.08.2009, at 14:21, Sebastian Herbszt wrote:

Filip Navara wrote:
Sebastian Herbszt wrote:
v0.11.0-rc0-182-g28e738d/pc-bios/optionrom/signrom.sh multiboot.raw
multiboot.bin
v0.11.0-rc0-182-g28e738d/pc-bios/optionrom/signrom.sh: * 512 - 1 : syntax
error: operand expected (error token is "* 512 - 1 ")
make[1]: *** [multiboot.bin] Error 1
rm multiboot.raw multiboot.img multiboot.o
make: *** [romsubdir-optionrom] Error 2

pc-bios/optionrom/signrom.sh has

# 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 ))

but it seems (at least my) MinGW doesn't include "dd".

I have already reported that on the mailing list earlier.
Workaround/fix is to download MSYS coreutils from the MinGW download
page.

Thanks for the hint - got it working now.

On a closer look at the "od" tool, the use of "dd" seems redundant:

     -j, --skip-bytes=BYTES
     skip BYTES input bytes first

     -N, --read-bytes=BYTES
     limit dump to BYTES input bytes

"od -N 1 -j 2 -t u1 -A n multiboot.raw" seems to do the same job and "od" is pre-shipped on MinGW/MSYS. But maybe "-j" and "-N" are not widely implemented. A possible alternative could
be the use of "head" and "cut".

Right, but we need dd later on anyways and I find dd parameters easier to read than the ones from od, probably because I simply use dd more often :-).

signrom.sh currently uses dd, od, expr, cp and printf. All seem to come from 
coreutils.
coreutils also includes the "sum" utility, which seems to compute the checksum 
you
calculate in the for loop if the option "-s" is specified.

In any case signrom.sh might check for the presence of tools used.

Good idea. Please post a patch!

Maybe something like the following in the hope that "which" is always available.

- Sebastian

diff --git a/pc-bios/optionrom/signrom.sh b/pc-bios/optionrom/signrom.sh
index 4322811..31c91f1 100755
--- a/pc-bios/optionrom/signrom.sh
+++ b/pc-bios/optionrom/signrom.sh
@@ -23,23 +23,53 @@
# did we get proper arguments?
test "$1" -a "$2" || exit 1

+DD=`which dd 2>/dev/null`
+if test $? -ne 0 ; then
+    echo dd not found.
+    exit 1
+fi
+
+OD=`which od 2>/dev/null`
+if test $? -ne 0 ; then
+    echo od not found.
+    exit 1
+fi
+
+EXPR=`which expr 2>/dev/null`
+if test $? -ne 0 ; then
+    echo expr not found.
+    exit 1
+fi
+
+CP=`which cp 2>/dev/null`
+if test $? -ne 0 ; then
+    echo cp not found.
+    exit 1
+fi
+
+PRINTF=`which printf 2>/dev/null`
+if test $? -ne 0 ; then
+    echo printf not found.
+    exit 1
+fi
+
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`
+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
-nums=`od -A n -t u1 -v "$1"`
+nums=`${OD} -A n -t u1 -v "$1"`
for i in ${nums}; do
    # add each byte's value to sum
-    sum=`expr $sum + $i`
+    sum=`${EXPR} $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
+${CP} "$1" "$2"
+${PRINTF} "\\$sum" | ${DD} of="$2" bs=1 count=1 seek=$size conv=notrunc 
2>/dev/null





reply via email to

[Prev in Thread] Current Thread [Next in Thread]