From patchwork Tue Jun 12 10:18:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 928224 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 414m7g32Njz9s0W for ; Tue, 12 Jun 2018 20:18:55 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 414m7g1mVqzF4GZ for ; Tue, 12 Jun 2018 20:18:55 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.66; helo=mail-wm0-f66.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 414m7Q5NyYzF4GY for ; Tue, 12 Jun 2018 20:18:42 +1000 (AEST) Received: by mail-wm0-f66.google.com with SMTP id v131-v6so22171280wma.1 for ; Tue, 12 Jun 2018 03:18:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/XIYaFgzlacDQ37gLlztX7Z+l9VknPE58ppez60Lw7U=; b=BTB6xwhPKjV43aUAB04Hc2frH6Vr+E/fjkVX/7Zs1YDHTUPQUAuqPi9gQbtc6KUEgk im9J6VV/YYHpUgotix7qReOhd9pCti/d22izCwLPraATI/sXpZAtflSQmYD3eG775+PZ TfFy6cgDk+fofmaTwo24VLv+NS0OB7a0lxJk2LCKQHxLKGdYixZy0hH+NlMIrSXxegPv 7/xLNBnQ4EZ+SzTtExd03a8+1V71d5yYlpTw5BZFX2RJ41JqveXUVzTg2AltIJkWcQY/ 5DWEukqDEUt7g26jtJF+mHrnHDT8kJrUtJl/BYBLC+I0TeZP8xSowy/5HKbwEl8qmApk oR4A== X-Gm-Message-State: APt69E3TBbCM8/hv8EhvG8CiKPjALrW3EV5x+8Ys3ixDTHl40P/+asU9 T9TPGlfxVnsmBbhqLd8MZ36MWpRlQH0= X-Google-Smtp-Source: ADUXVKI2orMaif1B3pO3rfeuy7ovC1cSt/t8FAxVbxfHvhObNemz/zYqBpBdRlz+WzhsBNgZxmHLOQ== X-Received: by 2002:a1c:6943:: with SMTP id e64-v6mr1746060wmc.14.1528798719179; Tue, 12 Jun 2018 03:18:39 -0700 (PDT) Received: from minerva.redhat.com ([90.77.100.34]) by smtp.gmail.com with ESMTPSA id m58-v6sm1275862wrf.61.2018.06.12.03.18.38 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 12 Jun 2018 03:18:38 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v3 1/3] test/parser: Make parser_scandir() ignore files with path len less than dir Date: Tue, 12 Jun 2018 12:18:32 +0200 Message-Id: <20180612101835.20872-2-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180612101835.20872-1-javierm@redhat.com> References: <20180612101835.20872-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Both the test files and directories added into the test harness are stored into the same file list. So the parser_scandir() stub compares the absolute file path of the files and the directory to scan, to know if a file belongs to the directory. Files whose absolute file path length isn't bigger than the directory to scan should just be ignored, since it means they can't be from that dir. Signed-off-by: Javier Martinez Canillas --- test/parser/utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/parser/utils.c b/test/parser/utils.c index 394efb3b209..c6d1a170a9b 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -325,6 +325,9 @@ int parser_scandir(struct discover_context *ctx, const char *dirname, if (f->dev != ctx->device) continue; + if (strlen(f->name) <= strlen(dirname)) + continue; + filename = strrchr(f->name, '/'); if (!filename) continue; From patchwork Tue Jun 12 10:18:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 928225 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 414m7p4Y5Pz9s0W for ; Tue, 12 Jun 2018 20:19:02 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 414m7p3GytzF4Gq for ; Tue, 12 Jun 2018 20:19:02 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.68; helo=mail-wm0-f68.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 414m7S2x7wzF4GT for ; Tue, 12 Jun 2018 20:18:44 +1000 (AEST) Received: by mail-wm0-f68.google.com with SMTP id e16-v6so19576543wmd.0 for ; Tue, 12 Jun 2018 03:18:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mdVavhruy6lyq1OKhzKMSAoBa7qRkzc0eu+JgQ98RrI=; b=oHTwhCF1/TM8WtACW1EgJbIJOEfpr4imcohK5JWbinxrT0CIV1/L3lk2HASiCpaaRa EaqOt/JzKMNyXHyutXNGStiNqrsfP+u/+tsql/XUz5UYENJQfJ7jtNz5Ve+5tfYOQNvA 3NMfXZZvkuf78oNpG7dW0V467i0hJrkJSO4kgt6tEc3MfwAxgSuccgMoLLvEAxt8V6fV pCB/FUjzRYUkJJKbHimbAO4C5/z+/Os1EwfLpJWyaFc4UGrH/h3FnTd8Y4eWmvZKukdg uzqcGbz9SDOqPcvx0X/yuVi6LtUIYOy48UqsVE5IXn4OpKtwrhQLgfB209XnudkLwKgE 5AEg== X-Gm-Message-State: APt69E2/F3XCLJL7J6MPTE7TJA64ABtWQgTA7jhYwZdRLsGFDtp5lFIU VSG3e+pQBL7vSKGVmO3tiF/Li5sQ9Rc= X-Google-Smtp-Source: ADUXVKJ+UQ1IApCfaFqNQ8eZiRLZqlSPjQsfzq2Mzs/c63jEtnc51WvcpctF2eozi7+1EHqvUVKVtw== X-Received: by 2002:a1c:852:: with SMTP id 79-v6mr1663600wmi.115.1528798720503; Tue, 12 Jun 2018 03:18:40 -0700 (PDT) Received: from minerva.redhat.com ([90.77.100.34]) by smtp.gmail.com with ESMTPSA id m58-v6sm1275862wrf.61.2018.06.12.03.18.39 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 12 Jun 2018 03:18:39 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v3 2/3] discover/grub: Use different paths to search for the BLS directory Date: Tue, 12 Jun 2018 12:18:33 +0200 Message-Id: <20180612101835.20872-3-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180612101835.20872-1-javierm@redhat.com> References: <20180612101835.20872-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Currenlty the BLS fragments are only searched in the /loader/entries directory, but this assumes that there is a boot partition mounted in /boot. This may not always be the case, /boot may not be a mount point and just a directory inside the root partition. To cover this case, Petitboot tries to find a GRUB 2 config file in different paths. So let's do the same for the BLS files directory. Also change some of the unit tests to use /boot/loader/entries as a BLS directory instead of /loader/entries. Signed-off-by: Javier Martinez Canillas --- discover/grub2/blscfg.c | 22 ++++++++++++++++--- .../test-grub2-blscfg-default-filename.c | 8 ++++--- test/parser/test-grub2-blscfg-default-index.c | 14 +++++++----- test/parser/test-grub2-blscfg-default-title.c | 8 ++++--- test/parser/test-grub2-blscfg-multiple-bls.c | 2 ++ test/parser/test-grub2-blscfg-opts-config.c | 2 ++ test/parser/test-grub2-blscfg-opts-grubenv.c | 2 ++ 7 files changed, 43 insertions(+), 15 deletions(-) diff --git a/discover/grub2/blscfg.c b/discover/grub2/blscfg.c index 78086ee9fb0..a3813064a0a 100644 --- a/discover/grub2/blscfg.c +++ b/discover/grub2/blscfg.c @@ -15,7 +15,11 @@ #include "discover/parser-conf.h" #include "discover/parser.h" -#define BLS_DIR "/loader/entries" +static const char *const bls_dirs[] = { + "/loader/entries", + "/boot/loader/entries", + NULL +}; struct bls_state { struct discover_boot_option *opt; @@ -195,8 +199,10 @@ int builtin_blscfg(struct grub2_script *script, struct conf_context *conf; struct bls_state *state; char *buf, *filename; + const char * const *dir; const char *blsdir; int n, len, rc = -1; + struct stat statbuf; conf = talloc_zero(dc, struct conf_context); if (!conf) @@ -209,7 +215,17 @@ int builtin_blscfg(struct grub2_script *script, blsdir = script_env_get(script, "blsdir"); if (!blsdir) - blsdir = BLS_DIR; + for (dir = bls_dirs; *dir; dir++) + if (!parser_stat_path(dc, dc->device, *dir, &statbuf)) { + blsdir = *dir; + break; + } + + if (!blsdir) { + device_handler_status_dev_info(dc->handler, dc->device, + _("BLS directory wasn't found")); + goto err; + } n = parser_scandir(dc, blsdir, &bls_entries, bls_filter, bls_sort); if (n <= 0) @@ -249,7 +265,7 @@ int builtin_blscfg(struct grub2_script *script, if (n > 0) { device_handler_status_dev_info(dc->handler, dc->device, _("Scanning %s failed"), - BLS_DIR); + blsdir); do { free(bls_entries[n]); } while (n-- > 0); diff --git a/test/parser/test-grub2-blscfg-default-filename.c b/test/parser/test-grub2-blscfg-default-filename.c index fb740599d1b..80a0e224406 100644 --- a/test/parser/test-grub2-blscfg-default-filename.c +++ b/test/parser/test-grub2-blscfg-default-filename.c @@ -10,11 +10,13 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" - "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-302.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-302.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-default-index.c b/test/parser/test-grub2-blscfg-default-index.c index 4ef3e2e68bc..b792d86381d 100644 --- a/test/parser/test-grub2-blscfg-default-index.c +++ b/test/parser/test-grub2-blscfg-default-index.c @@ -17,18 +17,20 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-300.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-300.fc28.x86_64.conf", "title Fedora (4.15.2-300.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-300.fc28.x86_64\n" - "initrd /initramfs-4.15.2-300.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-300.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n\n"); test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", "title Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.14.18-300.fc28.x86_64\n" - "initrd /initramfs-4.14.18-300.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.14.18-300.fc28.x86_64\n" + "initrd /boot/initramfs-4.14.18-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-default-title.c b/test/parser/test-grub2-blscfg-default-title.c index 94acf80bd54..778dcc0579a 100644 --- a/test/parser/test-grub2-blscfg-default-title.c +++ b/test/parser/test-grub2-blscfg-default-title.c @@ -11,6 +11,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, "/boot/grub2/grubenv", "# GRUB Environment Block\n" @@ -18,10 +20,10 @@ void run_test(struct parser_test *test) "kernelopts=root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" - "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-302.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-302.fc28.x86_64.img\n" "options $kernelopts\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-multiple-bls.c b/test/parser/test-grub2-blscfg-multiple-bls.c index 8fd218c371e..94f40d191fa 100644 --- a/test/parser/test-grub2-blscfg-multiple-bls.c +++ b/test/parser/test-grub2-blscfg-multiple-bls.c @@ -9,6 +9,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" diff --git a/test/parser/test-grub2-blscfg-opts-config.c b/test/parser/test-grub2-blscfg-opts-config.c index 856aae2adf5..fdce2294b0e 100644 --- a/test/parser/test-grub2-blscfg-opts-config.c +++ b/test/parser/test-grub2-blscfg-opts-config.c @@ -10,6 +10,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" diff --git a/test/parser/test-grub2-blscfg-opts-grubenv.c b/test/parser/test-grub2-blscfg-opts-grubenv.c index c77c589b770..544a5de4d23 100644 --- a/test/parser/test-grub2-blscfg-opts-grubenv.c +++ b/test/parser/test-grub2-blscfg-opts-grubenv.c @@ -10,6 +10,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/boot/grub2/grubenv", "# GRUB Environment Block\n" From patchwork Tue Jun 12 10:18:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 928226 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 414m7w3mZMz9s1B for ; Tue, 12 Jun 2018 20:19:08 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 414m7w2LkdzF4HB for ; Tue, 12 Jun 2018 20:19:08 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.66; helo=mail-wm0-f66.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 414m7S64yNzF4GZ for ; Tue, 12 Jun 2018 20:18:44 +1000 (AEST) Received: by mail-wm0-f66.google.com with SMTP id p11-v6so22161733wmc.4 for ; Tue, 12 Jun 2018 03:18:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=gDwE6fdFOyQHobij5noTbko3qZaKSP4FwrNx2iCzRkc=; b=NXYSprbyDPs9bYGnwau1KyerKk4eng+cClonUmCOAauQxq0r9ispq9gumKYBN4RwUL KvyeZRsDSSCYDHQ5i30xeVGW2cR/ATKMezq5uPziu3iH9OZB45+8+GXfMER0DLcVk9va izEu0o7YhOIPcldCxMF6h9FJ6rZoj0O/yxZyIXc4Z4O1bLRp2ggextk87OCvAhMcObpl RSblG8ZZvHLaS/8ZcdRTNH+zaJDbWbCW8/BM4giy8kEXhbQYepEUT7qi2oTTYWvd2rs1 qOc+DZ5g8RRhywiN0lJFc2cXWCuZeVZYbXVKCvubLYfA9TRkJYbtSXNs3NxiwIXLHKMF mj+A== X-Gm-Message-State: APt69E07OjufGYIzeA1etKa024vX/XFT2WXFg9hmov8OKoMUd9LnMLhV DPwSBPvP6VOTCEjjyiXundTV1YmAh9I= X-Google-Smtp-Source: ADUXVKKedG+RUeK5c+zV7d8dDNGtjg9tO+CVqMmEmzIWNj29lRorsvJTAKhJEYQPdPsQVHIzmEthTw== X-Received: by 2002:a1c:3c4:: with SMTP id 187-v6mr1583839wmd.96.1528798721592; Tue, 12 Jun 2018 03:18:41 -0700 (PDT) Received: from minerva.redhat.com ([90.77.100.34]) by smtp.gmail.com with ESMTPSA id m58-v6sm1275862wrf.61.2018.06.12.03.18.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 12 Jun 2018 03:18:40 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v3 3/3] discover/grub: Improve BLS grub environment variables expansion Date: Tue, 12 Jun 2018 12:18:34 +0200 Message-Id: <20180612101835.20872-4-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180612101835.20872-1-javierm@redhat.com> References: <20180612101835.20872-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" The fields from a BootLoaderSpec file can contain environment variables, in GRUB 2 these are show verbatim and are evaluated later when an entry is selected. But on Petitboot these have to be expanded before creating the GRUB 2 resources and show in the UI the values after the evaluation. The current blscfg handler had a very limited support for variables, it only had support for the options field and also didn't take into account that variables could be mixed with literal values. So for example the following fields were not expanded correctly: linux $bootprefix/vmlinuz options $kernelopts foo=bar options foo=bar $kernelopts options $kernelopts $debugopts Also change some of the tests to cover mixing variables and literals. Signed-off-by: Javier Martinez Canillas --- discover/grub2/blscfg.c | 85 ++++++++++++++++---- test/parser/test-grub2-blscfg-multiple-bls.c | 5 +- test/parser/test-grub2-blscfg-opts-grubenv.c | 4 +- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/discover/grub2/blscfg.c b/discover/grub2/blscfg.c index a3813064a0a..d4754aa363d 100644 --- a/discover/grub2/blscfg.c +++ b/discover/grub2/blscfg.c @@ -2,6 +2,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -34,54 +35,106 @@ struct bls_state { const char *dtb; }; +static char *field_append(struct bls_state *state, int type, char *buffer, + char *start, char *end) +{ + char *temp = talloc_strndup(state, start, end - start + 1); + const char *field = temp; + + if (type == GRUB2_WORD_VAR) { + field = script_env_get(state->script, temp); + if (!field) + return buffer; + } + + if (!buffer) + buffer = talloc_strdup(state->opt, field); + else + buffer = talloc_asprintf_append(buffer, "%s", field); + + return buffer; +} + +static char *expand_field(struct bls_state *state, char *value) +{ + char *buffer = NULL; + char *start = value; + char *end = value; + int type = GRUB2_WORD_TEXT; + + while (*value) { + if (*value == '$') { + if (start != end) { + buffer = field_append(state, type, buffer, + start, end); + if (!buffer) + return NULL; + } + + type = GRUB2_WORD_VAR; + start = value + 1; + } else if (type == GRUB2_WORD_VAR) { + if (!isalnum(*value) && *value != '_') { + buffer = field_append(state, type, buffer, + start, end); + type = GRUB2_WORD_TEXT; + start = value; + } + } + + end = value; + value++; + } + + if (start != end) { + buffer = field_append(state, type, buffer, + start, end); + if (!buffer) + return NULL; + } + + return buffer; +} + static void bls_process_pair(struct conf_context *conf, const char *name, char *value) { struct bls_state *state = conf->parser_info; struct discover_boot_option *opt = state->opt; struct boot_option *option = opt->option; - const char *boot_args; if (streq(name, "title")) { - state->title = talloc_strdup(state, value); + state->title = expand_field(state, value); return; } if (streq(name, "version")) { - state->version = talloc_strdup(state, value); + state->version = expand_field(state, value); return; } if (streq(name, "machine-id")) { - state->machine_id = talloc_strdup(state, value); + state->machine_id = expand_field(state, value); return; } if (streq(name, "linux")) { - state->image = talloc_strdup(state, value); + state->image = expand_field(state, value); return; } if (streq(name, "initrd")) { - state->initrd = talloc_strdup(state, value); + state->initrd = expand_field(state, value); return; } if (streq(name, "devicetree")) { - state->dtb = talloc_strdup(state, value); + state->dtb = expand_field(state, value); return; } if (streq(name, "options")) { - if (value[0] == '$') { - boot_args = script_env_get(state->script, value + 1); - if (!boot_args) - return; - - option->boot_args = talloc_strdup(opt, boot_args); - } else { - option->boot_args = talloc_strdup(opt, value); - } + option->boot_args = expand_field(state, value); return; } } diff --git a/test/parser/test-grub2-blscfg-multiple-bls.c b/test/parser/test-grub2-blscfg-multiple-bls.c index 94f40d191fa..d15fb24fd7e 100644 --- a/test/parser/test-grub2-blscfg-multiple-bls.c +++ b/test/parser/test-grub2-blscfg-multiple-bls.c @@ -1,6 +1,7 @@ #include "parser-test.h" #if 0 /* PARSER_EMBEDDED_CONFIG */ +set os_name=Fedora blscfg #endif @@ -13,14 +14,14 @@ void run_test(struct parser_test *test) test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", - "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" + "title $os_name (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n\n"); test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", - "title Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" + "title $os_name (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.14.18-300.fc28.x86_64\n" "initrd /initramfs-4.14.18-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); diff --git a/test/parser/test-grub2-blscfg-opts-grubenv.c b/test/parser/test-grub2-blscfg-opts-grubenv.c index 544a5de4d23..2dffd1b730c 100644 --- a/test/parser/test-grub2-blscfg-opts-grubenv.c +++ b/test/parser/test-grub2-blscfg-opts-grubenv.c @@ -22,7 +22,7 @@ void run_test(struct parser_test *test) "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" - "options $kernelopts\n"); + "options $kernelopts debug\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); @@ -32,5 +32,5 @@ void run_test(struct parser_test *test) opt = get_boot_option(ctx, 0); - check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root"); + check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root debug"); }