discover/grub: Use different paths to search for the BLS directory
authorJavier Martinez Canillas <javierm@redhat.com>
Tue, 12 Jun 2018 10:18:33 +0000 (12:18 +0200)
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>
Mon, 18 Jun 2018 00:56:29 +0000 (10:56 +1000)
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 <javierm@redhat.com>
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
discover/grub2/blscfg.c
test/parser/test-grub2-blscfg-default-filename.c
test/parser/test-grub2-blscfg-default-index.c
test/parser/test-grub2-blscfg-default-title.c
test/parser/test-grub2-blscfg-multiple-bls.c
test/parser/test-grub2-blscfg-opts-config.c
test/parser/test-grub2-blscfg-opts-grubenv.c

index 78086ee9fb0fa8d286afe160f132d0883edefdeb..a3813064a0a3daa30d47c168e4a54081e5b2c902 100644 (file)
 #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);
index fb740599d1b0a313430fa870c10593d7cb2096f3..80a0e224406859f140c083431ae22bfbb48569de 100644 (file)
@@ -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");
index 4ef3e2e68bccd6a4650d02c53d5d0d8b2f2cb2f8..b792d86381d88a2cd5c19c9d1f4cc8f4988e49b7 100644 (file)
@@ -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");
index 94acf80bd549768c6860621f4989af7dc7917959..778dcc0579a789c90c10d5467acc408bf8d433d3 100644 (file)
@@ -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");
index 8fd218c371e8b92135a565f8ed82c30a346dcb09..94f40d191fa7251eccd7c044e9f162a1aa0aa5f1 100644 (file)
@@ -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"
index 856aae2adf5fa1d7965b2289703bb17e4cd12d92..fdce2294b0eaaeb5e5c3814e77052ab76021d2f9 100644 (file)
@@ -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"
index c77c589b77079f7810e9952324ba1b973920ceb4..544a5de4d23abcad407a33dbf844806e5a81e351 100644 (file)
@@ -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"