From: Arkadiusz Miskiewicz <arekm@pld-linux.org>
To: linux-hotplug@vger.kernel.org
Subject: bashizm in hotplug scripts (including 20040401)
Date: Fri, 02 Apr 2004 00:11:45 +0000 [thread overview]
Message-ID: <200404020211.45303.arekm@pld-linux.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 1317 bytes --]
Hi,
hotplug package is seriously broken and won't work on POSIX/SUSv3
compilant /bin/sh shells.
$ echo $((0xff))
ksh: 0xff: bad number `0xff'
There is a lot of hex to dec conversions using bash only function in hotplug,
example:
echo $((0xff))
Under ksh (pdksh)
$ echo $((0xff))
ksh: 0xff: bad number `0xff'
There is more portable version
hex=0xff
echo "$((16#`echo "$hex" | sed -e 's#^0x##g'`))"
it works well on zsh, pdksh, bash in their enhaced mode but for example on
pdksh run in sh mode it overflows - example:
[arekm@mobarm arekm]$ echo $((16#ff))
255
[arekm@mobarm arekm]$ echo $((16#ffffffff))
-1
pdksh run as pdksh works though.
There are two solutions known to me right now:
- first, very easy - #!/bin/bash instead of #!/bin/sh in these scripts
- second working, POSIX/SUSv3 compilant but much slower; use awk for
conversions (see attached patch).
Any other known fast and portable hex to dec conversions?
ps. using hex2dec() function regardles of choosen conversion method would be
nice - it would allow easy way to change the way of doing conversion + it
explicitly says where hex number should occur
--
Arkadiusz Miśkiewicz CS at FoE, Wroclaw University of Technology
arekm.pld-linux.org, 1024/3DB19BBD, JID: arekm.jabber.org, PLD/Linux
[-- Attachment #2: hotplug-PLD.patch --]
[-- Type: text/x-diff, Size: 9588 bytes --]
diff -urN hotplug-2004_04_01.org/etc/hotplug/hotplug.functions hotplug-2004_04_01/etc/hotplug/hotplug.functions
--- hotplug-2004_04_01.org/etc/hotplug/hotplug.functions 2004-04-02 00:38:53.301487496 +0200
+++ hotplug-2004_04_01/etc/hotplug/hotplug.functions 2004-04-02 01:45:37.628737224 +0200
@@ -190,4 +190,13 @@
# empty line terminates events
}
+####################################################################
+
+# usage: hex2dec hexnumber
+hex2dec()
+{
+ hex="$1"
+ echo | awk "{ printf(\"%d\n\", \"$hex\"); }"
+}
+
# vim:syntax=sh
diff -urN hotplug-2004_04_01.org/etc/hotplug/ieee1394.agent hotplug-2004_04_01/etc/hotplug/ieee1394.agent
--- hotplug-2004_04_01.org/etc/hotplug/ieee1394.agent 2004-04-02 00:38:53.302487344 +0200
+++ hotplug-2004_04_01/etc/hotplug/ieee1394.agent 2004-04-02 00:54:07.717475136 +0200
@@ -39,9 +39,9 @@
fi
-device_vendor_id=$((0x$VENDOR_ID))
-device_specifier_id=$((0x$SPECIFIER_ID))
-device_version=$((0x$VERSION))
+device_vendor_id=$(hex2dec 0x$VENDOR_ID)
+device_specifier_id=$(hex2dec 0x$SPECIFIER_ID)
+device_version=$(hex2dec 0x$VERSION)
MATCH_VENDOR_ID=0x0001
MATCH_SPECIFIER_ID=0x0004
@@ -63,9 +63,11 @@
: check match for $module
# convert from hex to dec
- match_flags=$(($match_flags))
- vendor_id=$(($vendor_id)); model_id=$(($model_id))
- specifier_id=$(($specifier_id)); version=$(($version))
+ match_flags=$(hex2dec $match_flags)
+ vendor_id=$(hex2dec $vendor_id);
+ model_id=$(hex2dec $model_id)
+ specifier_id=$(hex2dec $specifier_id);
+ version=$(hex2dec $version)
: vendor_id $vendor_id $device_vendor_id
if [ $(($match_flags & $MATCH_VENDOR_ID)) -ne 0 -a $vendor_id -ne $device_vendor_id ]; then
diff -urN hotplug-2004_04_01.org/etc/hotplug/input.agent hotplug-2004_04_01/etc/hotplug/input.agent
--- hotplug-2004_04_01.org/etc/hotplug/input.agent 2004-04-02 00:38:53.323484152 +0200
+++ hotplug-2004_04_01/etc/hotplug/input.agent 2004-04-02 00:55:54.221284096 +0200
@@ -78,14 +78,14 @@
IFS=/
set $PRODUCT ''
IFS="$DEFAULT_IFS"
- i_bustype=$((0x$1))
- i_vendor=$((0x$2))
- i_product=$((0x$3))
- i_version=$((0x$4))
+ i_bustype=$(hex2dec 0x$1)
+ i_vendor=$(hex2dec 0x$2)
+ i_product=$(hex2dec 0x$3)
+ i_version=$(hex2dec 0x$4)
fi
if [ "$EV" != "" ]; then
- i_evBits=$((0x$EV))
+ i_evBits=$(hex2dec 0x$EV)
fi
input_join_words i_keyBits "$KEY"
@@ -101,14 +101,14 @@
INPUT_DEVICE_ID_MATCH_VENDOR=2
INPUT_DEVICE_ID_MATCH_PRODUCT=4
INPUT_DEVICE_ID_MATCH_VERSION=8
-INPUT_DEVICE_ID_MATCH_EVBIT=$((0x010))
-INPUT_DEVICE_ID_MATCH_KEYBIT=$((0x020))
-INPUT_DEVICE_ID_MATCH_RELBIT=$((0x040))
-INPUT_DEVICE_ID_MATCH_ABSBIT=$((0x080))
-INPUT_DEVICE_ID_MATCH_MSCBIT=$((0x100))
-INPUT_DEVICE_ID_MATCH_LEDBIT=$((0x200))
-INPUT_DEVICE_ID_MATCH_SNDBIT=$((0x400))
-INPUT_DEVICE_ID_MATCH_FFBIT=$((0x800))
+INPUT_DEVICE_ID_MATCH_EVBIT=$(hex2dec 0x010)
+INPUT_DEVICE_ID_MATCH_KEYBIT=$(hex2dec 0x020)
+INPUT_DEVICE_ID_MATCH_RELBIT=$(hex2dec 0x040)
+INPUT_DEVICE_ID_MATCH_ABSBIT=$(hex2dec 0x080)
+INPUT_DEVICE_ID_MATCH_MSCBIT=$(hex2dec 0x100)
+INPUT_DEVICE_ID_MATCH_LEDBIT=$(hex2dec 0x200)
+INPUT_DEVICE_ID_MATCH_SNDBIT=$(hex2dec 0x400)
+INPUT_DEVICE_ID_MATCH_FFBIT=$(hex2dec 0x800)
input_match_bits ()
@@ -118,8 +118,8 @@
if [ "$dev_bits" = "" ]; then
return 0
fi
- mword=$((0x${mod_bits##*:}))
- dword=$((0x${dev_bits##*:}))
+ mword=$(hex2dec 0x${mod_bits##*:})
+ dword=$(hex2dec 0x${dev_bits##*:})
while true; do
if [ $(( $mword & $dword != $mword )) -eq 1 ]; then
@@ -163,12 +163,12 @@
set $line
module="$1"
- matchBits=$(($2))
+ matchBits=$(hex2dec $2)
- bustype=$(($3))
- vendor=$(($4))
- product=$(($5))
- version=$(($6))
+ bustype=$(hex2dec $3)
+ vendor=$(hex2dec $4)
+ product=$(hex2dec $5)
+ version=$(hex2dec $6)
evBits="$7"
keyBits="$8"
@@ -180,7 +180,7 @@
ledBits="$3"
sndBits="$4"
ffBits="$5"
- driverInfo=$(($6))
+ driverInfo=$(hex2dec $6)
: checkmatch $module
diff -urN hotplug-2004_04_01.org/etc/hotplug/pci.agent hotplug-2004_04_01/etc/hotplug/pci.agent
--- hotplug-2004_04_01.org/etc/hotplug/pci.agent 2004-04-02 00:38:53.303487192 +0200
+++ hotplug-2004_04_01/etc/hotplug/pci.agent 2004-04-02 00:57:14.024152216 +0200
@@ -59,18 +59,18 @@
pci_convert_vars ()
{
- pci_class=$((0x$PCI_CLASS))
+ pci_class=$(hex2dec 0x$PCI_CLASS)
set $(echo $PCI_ID | sed -e 's/\([^:]*\):\(.*\)/\1 \2/')
- pci_id_vendor=$((0x$1))
- pci_id_device=$((0x$2))
+ pci_id_vendor=$(hex2dec 0x$1)
+ pci_id_device=$(hex2dec 0x$2)
set $(echo $PCI_SUBSYS_ID | sed -e 's/\([^:]*\):\(.*\)/\1 \2/')
- pci_subid_vendor=$((0x$1))
- pci_subid_device=$((0x$2))
+ pci_subid_vendor=$(hex2dec 0x$1)
+ pci_subid_device=$(hex2dec 0x$2)
}
-PCI_ANY=$((0xffffffff))
+PCI_ANY=$(hex2dec 0xffffffff)
#
@@ -95,9 +95,12 @@
esac
# convert the fields from hex to dec
- vendor=$(($vendor)); device=$(($device))
- subvendor=$(($subvendor)); subdevice=$(($subdevice))
- class=$(($class)); class_mask=$(($class_mask))
+ vendor=$(hex2dec $vendor)
+ device=$(hex2dec $device)
+ subvendor=$(hex2dec $subvendor)
+ subdevice=$(hex2dec $subdevice)
+ class=$(hex2dec $class)
+ class_mask=$(hex2dec $class_mask)
: checkmatch $module
diff -urN hotplug-2004_04_01.org/etc/hotplug/pci.rc hotplug-2004_04_01/etc/hotplug/pci.rc
--- hotplug-2004_04_01.org/etc/hotplug/pci.rc 2004-04-02 00:38:53.303487192 +0200
+++ hotplug-2004_04_01/etc/hotplug/pci.rc 2004-04-02 01:00:37.344242864 +0200
@@ -65,6 +65,7 @@
case "$1" in
start)
pci_boot_events
+ exit $?
;;
stop)
# echo $"pci stop -- ignored"
diff -urN hotplug-2004_04_01.org/etc/hotplug/usb.agent hotplug-2004_04_01/etc/hotplug/usb.agent
--- hotplug-2004_04_01.org/etc/hotplug/usb.agent 2004-04-02 00:38:53.318484912 +0200
+++ hotplug-2004_04_01/etc/hotplug/usb.agent 2004-04-02 00:59:47.428831160 +0200
@@ -181,9 +181,9 @@
-e "s+/\([0-9]\)\.\([0-9][0-9]\)+/0\1\2+" \
-e "s+/\([0-9][0-9]\)\.\([0-9][0-9]\)+/\1\2+"`
set $(echo $PRODUCT | sed -e 's+\([^/]*\)/\([^/]*\)/\(.*\)+\1 \2 \3+')
- usb_idVendor=$((0x$1))
- usb_idProduct=$((0x$2))
- usb_bcdDevice=$((0x$3))
+ usb_idVendor=$(hex2dec 0x$1)
+ usb_idProduct=$(hex2dec 0x$2)
+ usb_bcdDevice=$(hex2dec 0x$3)
if [ "$TYPE" != "" ]; then
IFS=/
@@ -193,9 +193,9 @@
usb_bDeviceProtocol=$3
IFS="$DEFAULT_IFS"
elif [ -r $SYSFS/$DEVPATH/bDeviceClass ]; then
- usb_bDeviceClass=$((0x$(cat $SYSFS/$DEVPATH/bDeviceClass)))
- usb_bDeviceSubClass=$((0x$(cat $SYSFS/$DEVPATH/bDeviceSubClass)))
- usb_bDeviceProtocol=$((0x$(cat $SYSFS/$DEVPATH/bDeviceProtocol)))
+ usb_bDeviceClass=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bDeviceClass))
+ usb_bDeviceSubClass=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bDeviceSubClass))
+ usb_bDeviceProtocol=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bDeviceProtocol))
else
# out-of-range values
usb_bDeviceClass=1000
@@ -211,9 +211,9 @@
usb_bInterfaceProtocol=$3
IFS="$DEFAULT_IFS"
elif [ -r $SYSFS/$DEVPATH/bInterfaceClass ]; then
- usb_bInterfaceClass=$((0x$(cat $SYSFS/$DEVPATH/bInterfaceClass)))
- usb_bInterfaceSubClass=$((0x$(cat $SYSFS/$DEVPATH/bInterfaceSubClass)))
- usb_bInterfaceProtocol=$((0x$(cat $SYSFS/$DEVPATH/bInterfaceProtocol)))
+ usb_bInterfaceClass=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bInterfaceClass))
+ usb_bInterfaceSubClass=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bInterfaceSubClass))
+ usb_bInterfaceProtocol=$(hex2dec 0x$(cat $SYSFS/$DEVPATH/bInterfaceProtocol))
else
# out-of-range values
usb_bInterfaceClass=1000
@@ -222,16 +222,16 @@
fi
}
-USB_MATCH_VENDOR=$((0x0001))
-USB_MATCH_PRODUCT=$((0x0002))
-USB_MATCH_DEV_LO=$((0x0004))
-USB_MATCH_DEV_HI=$((0x0008))
-USB_MATCH_DEV_CLASS=$((0x0010))
-USB_MATCH_DEV_SUBCLASS=$((0x0020))
-USB_MATCH_DEV_PROTOCOL=$((0x0040))
-USB_MATCH_INT_CLASS=$((0x0080))
-USB_MATCH_INT_SUBCLASS=$((0x0100))
-USB_MATCH_INT_PROTOCOL=$((0x0200))
+USB_MATCH_VENDOR=$(hex2dec 0x0001)
+USB_MATCH_PRODUCT=$(hex2dec 0x0002)
+USB_MATCH_DEV_LO=$(hex2dec 0x0004)
+USB_MATCH_DEV_HI=$(hex2dec 0x0008)
+USB_MATCH_DEV_CLASS=$(hex2dec 0x0010)
+USB_MATCH_DEV_SUBCLASS=$(hex2dec 0x0020)
+USB_MATCH_DEV_PROTOCOL=$(hex2dec 0x0040)
+USB_MATCH_INT_CLASS=$(hex2dec 0x0080)
+USB_MATCH_INT_SUBCLASS=$(hex2dec 0x0100)
+USB_MATCH_INT_PROTOCOL=$(hex2dec 0x0200)
#
# stdin is "modules.usbmap" syntax
@@ -255,21 +255,21 @@
set $line
module=$1
- match_flags=$(($2))
+ match_flags=$(hex2dec $2)
- idVendor=$(($3))
- idProduct=$(($4))
- bcdDevice_lo=$(($5))
- bcdDevice_hi=$(($6))
-
- bDeviceClass=$(($7))
- bDeviceSubClass=$(($8))
- bDeviceProtocol=$(($9))
+ idVendor=$(hex2dec $3)
+ idProduct=$(hex2dec $4)
+ bcdDevice_lo=$(hex2dec $5)
+ bcdDevice_hi=$(hex2dec $6)
+
+ bDeviceClass=$(hex2dec $7)
+ bDeviceSubClass=$(hex2dec $8)
+ bDeviceProtocol=$(hex2dec $9)
shift 9
- bInterfaceClass=$(($1))
- bInterfaceSubClass=$(($2))
- bInterfaceProtocol=$(($3))
+ bInterfaceClass=$(hex2dec $1)
+ bInterfaceSubClass=$(hex2dec $2)
+ bInterfaceProtocol=$(hex2dec $3)
: checkmatch $module
diff -urN hotplug-2004_04_01.org/etc/hotplug.d/default/default.hotplug hotplug-2004_04_01/etc/hotplug.d/default/default.hotplug
--- hotplug-2004_04_01.org/etc/hotplug.d/default/default.hotplug 2004-04-02 00:38:53.324484000 +0200
+++ hotplug-2004_04_01/etc/hotplug.d/default/default.hotplug 2004-04-02 01:01:00.153775288 +0200
@@ -32,7 +32,7 @@
# DEBUG=yes export DEBUG
-debug_mesg "arguments ($*) env (`env`)"
+[ -n "$DEBUG" ] && debug_mesg "arguments ($*) env (`env`)"
#
# Only one required argument: event type type being dispatched.
next reply other threads:[~2004-04-02 0:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-04-02 0:11 Arkadiusz Miskiewicz [this message]
2004-04-02 1:09 ` bashizm in hotplug scripts (including 20040401) Martin Schwenke
2004-04-02 13:05 ` Arkadiusz Miskiewicz
2004-04-05 6:06 ` Martin Schwenke
2004-04-05 17:11 ` Greg KH
2004-04-05 17:46 ` Arkadiusz Miskiewicz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200404020211.45303.arekm@pld-linux.org \
--to=arekm@pld-linux.org \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).