]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
uefi-lib/uefi-lib.sh: fixed script for bash version 5
authorHarald Hoyer <harald@redhat.com>
Fri, 24 Jan 2020 12:40:15 +0000 (13:40 +0100)
committerHarald Hoyer <harald@redhat.com>
Fri, 24 Jan 2020 12:42:46 +0000 (13:42 +0100)
bash 5 `read` behaves differently and returns != 0 for 0 bytes read

fix it with the best effort

modules.d/99uefi-lib/uefi-lib.sh

index 6b2639902c8a88ce716de55ede95131cd71a9836..6eac0ccfd07bdc74279875b87682857f0fba0425 100755 (executable)
@@ -18,7 +18,7 @@
 #
 
 getbyte () {
 #
 
 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
     read -r -n 1 -d '' c
     res=$?
     # the single quote in the argument of the printf
@@ -29,9 +29,9 @@ getbyte () {
 }
 
 getword () {
 }
 
 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
     (( 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()
 {
 # 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
     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<len-4; i++)); do tt=$(getbyte); done
+                    ;;
+            esac
+        done
+    } < "$data"
 }
 
 }
 
+# /home/harald/Downloads/FcoeBootDevice-80005007-4248-4e4b-8df4-93060220756f
+
 get_fcoe_boot_mac()
 {
     data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
 get_fcoe_boot_mac()
 {
     data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
-    [ -f $data ] || return 1
+    [ -f "$data" ] || return 1
     local IFS= LC_CTYPE=C tt len type hextype
     local IFS= LC_CTYPE=C tt len type hextype
-    first=1
-
-    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)
-                read -r -N 27  tt || return 1
-                ;;
-            7fff)
-                # END
-                return 0
-                ;;
-            *)
-                read -r -N $(($len-4))  tt || return 1
-                ;;
-        esac
-    done < $data
+    {
+        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")
+            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<len-4; i++)); do tt=$(getbyte); done
+                    ;;
+            esac
+        done
+    } < "$data"
 }
 
 get_fcoe_boot_vlan()
 {
     data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
 }
 
 get_fcoe_boot_vlan()
 {
     data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data}
-    [ -f $data ] || return 1
+    [ -f "$data" ] || return 1
     local IFS= LC_CTYPE=C tt len type hextype
     local IFS= LC_CTYPE=C tt len type hextype
-    first=1
-
-    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
-                ;;
-            *)
-                read -r -N $(($len-4))  tt || return 1
-                ;;
-        esac
-    done < $data
+    {
+        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")
+            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<len; i++)); do tt=$(getbyte); done
+                    ;;
+            esac
+        done
+    } < "$data"
 }
 }