From bb107ad9c13d244bf4aed255da913d6000c28833 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Wed, 31 Mar 2021 13:47:35 +0100 Subject: [PATCH] base-files: functions: introduce new helper functions Introduce cmdline_get_var() to /lib/function.sh and make use of it in export_rootdev() in /lib/upgrade/common.sh, making the code more simple and removing one level of indentation. Introduce get_partition_by_name() to /lib/upgrade/common.sh which is useful on non-EFI GPT platforms like mt7622. Remove some dead-code while at it. Signed-off-by: Daniel Golle --- package/base-files/files/lib/functions.sh | 10 ++ .../base-files/files/lib/upgrade/common.sh | 121 +++++++++--------- 2 files changed, 68 insertions(+), 63 deletions(-) diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh index 2bad45324f..d8604415cc 100644 --- a/package/base-files/files/lib/functions.sh +++ b/package/base-files/files/lib/functions.sh @@ -384,4 +384,14 @@ board_name() { [ -e /tmp/sysinfo/board_name ] && cat /tmp/sysinfo/board_name || echo "generic" } +cmdline_get_var() { + local var=$1 + local cmdlinevar tmp + + for cmdlinevar in $(cat /proc/cmdline); do + tmp=${cmdlinevar##${var}} + [ "=" = "${tmp:0:1}" ] && echo ${tmp:1} + done +} + [ -z "$IPKG_INSTROOT" ] && [ -f /lib/config/uci.sh ] && . /lib/config/uci.sh diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh index 968893e226..b0a482821d 100644 --- a/package/base-files/files/lib/upgrade/common.sh +++ b/package/base-files/files/lib/upgrade/common.sh @@ -147,71 +147,57 @@ part_magic_fat() { } export_bootdevice() { - local cmdline bootdisk rootpart uuid blockdev uevent line class + local cmdline uuid blockdev uevent line class local MAJOR MINOR DEVNAME DEVTYPE + local rootpart="$(cmdline_get_var root)" + + case "$rootpart" in + PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-[a-f0-9][a-f0-9]) + uuid="${rootpart#PARTUUID=}" + uuid="${uuid%-[a-f0-9][a-f0-9]}" + for blockdev in $(find /dev -type b); do + set -- $(dd if=$blockdev bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') + if [ "$4$3$2$1" = "$uuid" ]; then + uevent="/sys/class/block/${blockdev##*/}/uevent" + break + fi + done + ;; + PARTUUID=????????-????-????-????-??????????02) + uuid="${rootpart#PARTUUID=}" + uuid="${uuid%02}00" + for disk in $(find /dev -type b); do + set -- $(dd if=$disk bs=1 skip=568 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"') + if [ "$4$3$2$1-$6$5-$8$7-$9" = "$uuid" ]; then + uevent="/sys/class/block/${disk##*/}/uevent" + break + fi + done + ;; + /dev/*) + uevent="/sys/class/block/${rootpart##*/}/../uevent" + ;; + 0x[a-f0-9][a-f0-9][a-f0-9] | 0x[a-f0-9][a-f0-9][a-f0-9][a-f0-9] | \ + [a-f0-9][a-f0-9][a-f0-9] | [a-f0-9][a-f0-9][a-f0-9][a-f0-9]) + rootpart=0x${rootpart#0x} + for class in /sys/class/block/*; do + while read line; do + export -n "$line" + done < "$class/uevent" + if [ $((rootpart/256)) = $MAJOR -a $((rootpart%256)) = $MINOR ]; then + uevent="$class/../uevent" + fi + done + ;; + esac - if read cmdline < /proc/cmdline; then - case "$cmdline" in - *root=*) - rootpart="${cmdline##*root=}" - rootpart="${rootpart%% *}" - ;; - esac - - case "$bootdisk" in - /dev/*) - uevent="/sys/class/block/${bootdisk##*/}/uevent" - ;; - esac - - case "$rootpart" in - PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-[a-f0-9][a-f0-9]) - uuid="${rootpart#PARTUUID=}" - uuid="${uuid%-[a-f0-9][a-f0-9]}" - for blockdev in $(find /dev -type b); do - set -- $(dd if=$blockdev bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') - if [ "$4$3$2$1" = "$uuid" ]; then - uevent="/sys/class/block/${blockdev##*/}/uevent" - break - fi - done - ;; - PARTUUID=????????-????-????-????-??????????02) - uuid="${rootpart#PARTUUID=}" - uuid="${uuid%02}00" - for disk in $(find /dev -type b); do - set -- $(dd if=$disk bs=1 skip=568 count=16 2>/dev/null | hexdump -v -e '8/1 "%02x "" "2/1 "%02x""-"6/1 "%02x"') - if [ "$4$3$2$1-$6$5-$8$7-$9" = "$uuid" ]; then - uevent="/sys/class/block/${disk##*/}/uevent" - break - fi - done - ;; - /dev/*) - uevent="/sys/class/block/${rootpart##*/}/../uevent" - ;; - 0x[a-f0-9][a-f0-9][a-f0-9] | 0x[a-f0-9][a-f0-9][a-f0-9][a-f0-9] | \ - [a-f0-9][a-f0-9][a-f0-9] | [a-f0-9][a-f0-9][a-f0-9][a-f0-9]) - rootpart=0x${rootpart#0x} - for class in /sys/class/block/*; do - while read line; do - export -n "$line" - done < "$class/uevent" - if [ $((rootpart/256)) = $MAJOR -a $((rootpart%256)) = $MINOR ]; then - uevent="$class/../uevent" - fi - done - ;; - esac - - if [ -e "$uevent" ]; then - while read line; do - export -n "$line" - done < "$uevent" - export BOOTDEV_MAJOR=$MAJOR - export BOOTDEV_MINOR=$MINOR - return 0 - fi + if [ -e "$uevent" ]; then + while read line; do + export -n "$line" + done < "$uevent" + export BOOTDEV_MAJOR=$MAJOR + export BOOTDEV_MINOR=$MINOR + return 0 fi return 1 @@ -242,6 +228,15 @@ hex_le32_to_cpu() { echo "$@" } +get_partition_by_name() { + for partname in /sys/class/block/$1/*/name; do + [ "$(cat ${partname})" = "$2" ] && { + basename ${partname%%/name} + break + } + done +} + get_partitions() { # local disk="$1" local filename="$2" -- 2.30.2