Skip to content

Commit

Permalink
uefi-lib/uefi-lib.sh: fixed script for bash version 5
Browse files Browse the repository at this point in the history
bash 5 `read` behaves differently and returns != 0 for 0 bytes read

fix it with the best effort
  • Loading branch information
haraldh committed Jan 24, 2020
1 parent d613d88 commit 350ec5d
Showing 1 changed file with 115 additions and 100 deletions.
215 changes: 115 additions & 100 deletions modules.d/99uefi-lib/uefi-lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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<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}
[ -f $data ] || return 1
[ -f "$data" ] || return 1
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}
[ -f $data ] || return 1
[ -f "$data" ] || return 1
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"
}

0 comments on commit 350ec5d

Please sign in to comment.