Skip to content

Commit

Permalink
discover/grub2: Allow to separate the --id argument using a space char
Browse files Browse the repository at this point in the history
The GRUB menuentry command allows to separate the arguments for options
using either a '=' or a ' '. The latter is the convention used when the
menu entries are defined in the GRUB config file, but this is currently
not supported by Petitboot.

Add tests to cover both using '--id=foo' and '--id foo' as options.

Signed-off-by: Javier Martinez Canillas <[email protected]>
Signed-off-by: Samuel Mendoza-Jonas <[email protected]>
  • Loading branch information
martinezjavier authored and sammj committed Jun 21, 2019
1 parent 53e0f3e commit 7edc34c
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 3 deletions.
13 changes: 10 additions & 3 deletions discover/grub2/script.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,9 +339,16 @@ int statement_menuentry_execute(struct grub2_script *script,
* implementation to get --id= working.
*/
for (i = 1; i < st->argv->argc; ++i) {
if (strncmp("--id=", st->argv->argv[i], 5) == 0) {
id = st->argv->argv[i] + 5;
break;
if (strncmp("--id", st->argv->argv[i], strlen("--id")) == 0) {
if (strlen(st->argv->argv[i]) > strlen("--id=")) {
id = st->argv->argv[i] + strlen("--id=");
break;
}

if (i + 1 < st->argv->argc) {
id = st->argv->argv[i + 1];
break;
}
}
}
if (st->argv->argc > 0)
Expand Down
2 changes: 2 additions & 0 deletions test/parser/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ parser_TESTS = \
test/parser/test-grub2-noeol \
test/parser/test-grub2-menuentry-formats \
test/parser/test-grub2-if-formats \
test/parser/test-grub2-default-id \
test/parser/test-grub2-default-id-space \
test/parser/test-grub2-default-index \
test/parser/test-grub2-default-multiword \
test/parser/test-grub2-implicit-default-unset \
Expand Down
34 changes: 34 additions & 0 deletions test/parser/test-grub2-default-id-space.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

#include "parser-test.h"

#if 0 /* PARSER_EMBEDDED_CONFIG */
set default=option1
menuentry 'test-option-0' --id option0 {
linux /vmlinux.0
}
menuentry 'test-option-1' --id option1 {
linux /vmlinux.1
}
menuentry 'test-option-2' --id option2 {
linux /vmlinux.2
}
#endif

void run_test(struct parser_test *test)
{
struct discover_boot_option *opt;
struct discover_context *ctx;

test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
test_run_parser(test, "grub2");

ctx = test->ctx;

check_boot_option_count(ctx, 3);
opt = get_boot_option(ctx, 1);

check_name(opt, "test-option-1");
check_resolved_local_resource(opt->boot_image, ctx->device,
"/vmlinux.1");
check_is_default(opt);
}
34 changes: 34 additions & 0 deletions test/parser/test-grub2-default-id.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

#include "parser-test.h"

#if 0 /* PARSER_EMBEDDED_CONFIG */
set default=option1
menuentry 'test-option-0' --id=option0 {
linux /vmlinux.0
}
menuentry 'test-option-1' --id=option1 {
linux /vmlinux.1
}
menuentry 'test-option-2' --id=option2 {
linux /vmlinux.2
}
#endif

void run_test(struct parser_test *test)
{
struct discover_boot_option *opt;
struct discover_context *ctx;

test_read_conf_embedded(test, "/boot/grub2/grub.cfg");
test_run_parser(test, "grub2");

ctx = test->ctx;

check_boot_option_count(ctx, 3);
opt = get_boot_option(ctx, 1);

check_name(opt, "test-option-1");
check_resolved_local_resource(opt->boot_image, ctx->device,
"/vmlinux.1");
check_is_default(opt);
}

0 comments on commit 7edc34c

Please sign in to comment.