From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,MISSING_DATE,MISSING_MID, NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.1 From: "Leonid Krivoshein" To: make-initrd@lists.altlinux.org Subject: [make-initrd] [PATCH v6 10/22] bootchain-core: expanded addressing capabilities X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Date: Sun, 24 Oct 2021 17:21:27 -0000 X-List-Received-Date: Sun, 24 Oct 2021 17:21:27 -0000 Message-ID: <20211024172127.fsYT6Po9o4nifGFrUHfaXUiVFmy4AK5w3TOXgMZQTGA@z> Archived-At: List-Archive: Adds support for reverse addressing relative to the current step, as well as calculating the path to the special device node obtained in the previous step. Signed-off-by: Leonid Krivoshein --- features/bootchain-core/README.md | 6 +++ .../data/bin/bootchain-sh-functions | 37 ++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/features/bootchain-core/README.md b/features/bootchain-core/README.md index 8d341e0..ba66259 100644 --- a/features/bootchain-core/README.md +++ b/features/bootchain-core/README.md @@ -49,6 +49,12 @@ us to optimize fill in `initramfs` only which we are need. - Modularity: loading methods are initially separated from the common code and daemon. +- Via resolve_target() supports not only forward, but also reverse addressing, + relative to the current step. For example, a record like `step-3/dir1/dev` + will process the result of `dir1/dev`, made in the third step from the current + one. Together with the overload of the chain of steps, direct addressing is safe + only when storing the numbers of the completed steps in files, whereas reverse + relative addressing it is safe in any case and can often be more convenient. - Allows you to work with shorter and more familiar paths to special files devices thanks to the use of `DEVNAME` along with `dev`. diff --git a/features/bootchain-core/data/bin/bootchain-sh-functions b/features/bootchain-core/data/bin/bootchain-sh-functions index e73fd35..0eebbaf 100644 --- a/features/bootchain-core/data/bin/bootchain-sh-functions +++ b/features/bootchain-core/data/bin/bootchain-sh-functions @@ -27,19 +27,46 @@ get_parameter() resolve_target() { local target="$1" + local where="${target%%/*}" + local n="${#where}" - case "${target%%/*}" in + target="${target:$n}" + + case "$where" in '') ;; pipe[0-9]|pipe[0-9][0-9]|pipe[0-9][0-9][0-9]) - target="$mntdir/dst/step${target:4}" + [ -d "$mntdir/dst/step${where:4}" ] || + return 0 + target="$(readlink-e "$mntdir/dst/step${where:4}")${target}" + ;; + step-[1-9]|step-[1-9][0-9]|step-[1-9][0-9][0-9]) + case "$destdir" in + "$mntdir"/dst/step[0-9]*) + n="${destdir##*/}" + n="$(( ${n:4} - ${where:5} ))" + ;; + *) + return 0 + ;; + esac + [ "$n" -ge 0 ] && [ -d "$mntdir/dst/step$n" ] || + return 0 + target="$(readlink-e "$mntdir/dst/step$n")${target}" ;; *) if [ -z "${prevdir-}" ]; then - message "no previous stop to use" - return + message "no previous step results to use with $name" + return 0 + fi + if [ -z "$target" ] && + [ "$where" = DEVNAME ] && + [ -s "$prevdir"/DEVNAME ] + then + read -r target <"$prevdir"/DEVNAME ||: + else + target="$prevdir/${where#/}${target}" fi - target="$prevdir/${target#/}" ;; esac -- 2.24.1