From: Harald Hoyer Date: Fri, 24 Jan 2020 12:40:15 +0000 (+0100) Subject: uefi-lib/uefi-lib.sh: fixed script for bash version 5 X-Git-Tag: 050~65 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fdracut.git;a=commitdiff_plain;h=350ec5d9dd407b2cd1ca23a02a3f1a9c426ec055 uefi-lib/uefi-lib.sh: fixed script for bash version 5 bash 5 `read` behaves differently and returns != 0 for 0 bytes read fix it with the best effort --- diff --git a/modules.d/99uefi-lib/uefi-lib.sh b/modules.d/99uefi-lib/uefi-lib.sh index 6b2639902..6eac0ccfd 100755 --- a/modules.d/99uefi-lib/uefi-lib.sh +++ b/modules.d/99uefi-lib/uefi-lib.sh @@ -18,7 +18,7 @@ # getbyte () { - local IFS= LC_CTYPE=C res c + local IFS= LC_CTYPE=C res c=0 read -r -n 1 -d '' c res=$? # the single quote in the argument of the printf @@ -29,9 +29,9 @@ getbyte () { } getword () { - local b1 b2 val - b1=$(getbyte) || return 1 - b2=$(getbyte) || return 1 + local b1=0 b2=0 val=0 + b1=$(getbyte) + b2=$(getbyte) (( val = b2 * 256 + b1 )) echo $val return 0 @@ -40,114 +40,129 @@ getword () { # Acpi(PNP0A08,0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)/MAC(90E2BA265ED4,0x0)/Vlan(172)/Fibre(0x4EA06104A0CC0050,0x0) uefi_device_path() { + data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data} + [ -f "$data" ] || return 1 + local IFS= LC_CTYPE=C res tt len type hextype first first=1 - - while :; do - type=$(getbyte) || return 1 - subtype=$(getbyte) || return 1 - len=$(getword) || return 1 - hextype=$(printf "%02x%02x" "$type" "$subtype") - if [[ $first == 1 ]]; then - first=0 - elif [[ $hextype != "7fff" ]]; then - printf "/" - fi - case $hextype in - 0101) - # PCI - tt=$(getword) - printf "PCI(0x%x,0x%x)" $(($tt / 256)) $(($tt & 255)) - ;; - 0201) - # ACPI - printf "Acpi(0x%x,0x%x)" $(($(getword) + $(getword) * 65536)) $(($(getword) + $(getword) * 65536)) - ;; - 0303) - # FIBRE - getword &>/dev/null - getword &>/dev/null - printf "Fibre(0x%x%x%x%x%x%x%x%x,0x%x)" \ - $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ - $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ - $(( $(getword) + $(getword) * 65536 + 4294967296 * ( $(getword) + $(getword) * 65536 ) )) - ;; - 030b) - # MAC - printf "MAC(%02x%02x%02x%02x%02x%02x," $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) - read -r -N 26 tt || return 1 - printf "0x%x)" $(getbyte) - ;; - 0314) - # VLAN - printf "VLAN(%d)" $(getword) - ;; - 7fff) - # END - printf "\n" - return 0 - ;; - *) - printf "Unknown(Type:%d SubType:%d len=%d)" "$type" "$subtype" "$len" - read -r -N $(($len-4)) tt || return 1 - ;; - esac - done + { + getword >/dev/null + getword >/dev/null + while :; do + type=$(getbyte) || return 1 + subtype=$(getbyte) || return 1 + len=$(getword) || return 1 + hextype=$(printf "%02x%02x" "$type" "$subtype") + if [[ $first == 1 ]]; then + first=0 + elif [[ $hextype != "7fff" ]]; then + printf "/" + fi + case $hextype in + 0101) + # PCI + tt=$(getword) + printf "PCI(0x%x,0x%x)" $(($tt / 256)) $(($tt & 255)) + ;; + 0201) + # ACPI + printf "Acpi(0x%x,0x%x)" $(($(getword) + $(getword) * 65536)) $(($(getword) + $(getword) * 65536)) + ;; + 0303) + # FIBRE + getword &>/dev/null + getword &>/dev/null + printf "Fibre(0x%x%x%x%x%x%x%x%x,0x%x)" \ + $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ + $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ + $(( $(getword) + $(getword) * 65536 + 4294967296 * ( $(getword) + $(getword) * 65536 ) )) + ;; + 030b) + # MAC + printf "MAC(%02x%02x%02x%02x%02x%02x," $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) + for((i=0; i<26; i++)); do tt=$(getbyte) || return 1; done + #read -r -d '' -n 26 tt || return 1 + printf "0x%x)" $(getbyte) + ;; + 0314) + # VLAN + printf "VLAN(%d)" $(getword) + ;; + 7fff) + # END + printf "\n" + return 0 + ;; + *) + #printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2 + for((i=0; i/dev/null + getword >/dev/null + while :; do + type=$(getbyte) || return 1 + subtype=$(getbyte) || return 1 + len=$(getword) || return 1 + hextype=$(printf "%02x%02x" "$type" "$subtype") + case $hextype in + 030b) + # MAC + printf "%02x:%02x:%02x:%02x:%02x:%02x" $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) + for((i=0; i<27; i++)); do tt=$(getbyte) || return 1; done + ;; + 7fff) + # END + return 0 + ;; + *) + #printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2 + for((i=0; i/dev/null + getword >/dev/null + while :; do + type=$(getbyte) || return 1 + subtype=$(getbyte) || return 1 + len=$(getword) || return 1 + hextype=$(printf "%02x%02x" "$type" "$subtype") + case $hextype in + 0314) + # VLAN + printf "%d" $(getword) + ;; + 7fff) + # END + return 0 + ;; + *) + #printf "Unknown(Type:0x%02x SubType:0x%02x len=%d)\n" "$type" "$subtype" "$len" >&2 + for((i=0; i