From patchwork Wed Nov 20 02:42:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 1197775 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.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47Hnfq64Nlz9sPV for ; Wed, 20 Nov 2019 14:07:15 +1100 (AEDT) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=ozlabs.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="TNFQSf9B"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 47Hnfq2dkwzDqBh for ; Wed, 20 Nov 2019 14:07:15 +1100 (AEDT) X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [203.11.71.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Hn9T4JSJzDqgs for ; Wed, 20 Nov 2019 13:45:17 +1100 (AEDT) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=ozlabs.org Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=ozlabs.org header.i=@ozlabs.org header.b="TNFQSf9B"; dkim-atps=neutral Received: by ozlabs.org (Postfix, from userid 1023) id 47Hn9R1C7Lz9sPK; Wed, 20 Nov 2019 13:45:14 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ozlabs.org; s=201707; t=1574217915; bh=vbRUHv+aXFTgYX/1+39Y6kd7UehaZhB5gRtsItiFPdI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=TNFQSf9BdLnLwOtFW/SfWEIoufQpyHio3rcyxl9Babk+cVhV9BP+4zYG/koRACCu0 oMPhK3N6dfHWG4vu3RxUn1f5m+DBW29amensKEYSHxuaPA4tflM8ynBU58PpJHUNT6 KQBzU7/DQo//UwjGW/hnnA0gRqiHwBtTqvqgHDGqbe861Is+ylMMGX/G6muo/nwH6K 0US9o6mKnTnnlLum5DGl393QBISn3kJLcM/CL/QJt60p6p7xW0Epl7KdTwuX3YW3hw gn1jeML+R8ZNR7XLEiAebNfHX/e5oJoqmf2lb/0UdRM9mqxEt3TK0YT2KchY7cgMF5 qqB+4GiAiTXEA== From: Jeremy Kerr To: petitboot@lists.ozlabs.org Subject: [PATCH 02/14] discover/grub2: Use getopt for `search` argument parsing Date: Wed, 20 Nov 2019 10:42:54 +0800 Message-Id: <20191120024306.16526-3-jk@ozlabs.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191120024306.16526-1-jk@ozlabs.org> References: <20191120024306.16526-1-jk@ozlabs.org> MIME-Version: 1.0 X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" The search command will be extended to add the full set of grub2-style arguments, so switch to using getopt, rather than manual parsing. This means we now support `--set=foo` and `--set foo` style arguments, both of which appear in the docs and common grub configs. Also, add a small test for the search argument handling. Signed-off-by: Jeremy Kerr --- discover/grub2/builtins.c | 33 +++++++++++++++++++++++----- test/parser/Makefile.am | 1 + test/parser/test-grub2-search-args.c | 33 ++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 test/parser/test-grub2-search-args.c diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c index 3f09319..ab6b0ec 100644 --- a/discover/grub2/builtins.c +++ b/discover/grub2/builtins.c @@ -1,4 +1,7 @@ +#define _GNU_SOURCE + +#include #include #include @@ -106,18 +109,35 @@ static int builtin_initrd(struct grub2_script *script, return 0; } +static const struct option search_options[] = { + { + .name = "set", + .has_arg = required_argument, + .val = 's', + }, + { 0 }, +}; + static int builtin_search(struct grub2_script *script, void *data __attribute__((unused)), int argc, char *argv[]) { const char *env_var, *spec; - int i; env_var = "root"; + optind = 0; + + for (;;) { + int c = getopt_long(argc, argv, ":", search_options, NULL); + if (c == -1) + break; - for (i = 1; i < argc - 1; i++) { - if (!strncmp(argv[i], "--set=", strlen("--set="))) { - env_var = argv[i] + strlen("--set="); + switch (c) { + case 's': + env_var = optarg; + break; + case '?': + case ':': break; } } @@ -125,7 +145,10 @@ static int builtin_search(struct grub2_script *script, if (!strlen(env_var)) return 0; - spec = argv[argc - 1]; + if (optind >= argc) + return -1; + + spec = argv[optind]; script_env_set(script, env_var, spec); diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am index 748c836..df9c539 100644 --- a/test/parser/Makefile.am +++ b/test/parser/Makefile.am @@ -29,6 +29,7 @@ parser_TESTS = \ test/parser/test-grub2-multiple-id \ test/parser/test-grub2-single-line-if \ test/parser/test-grub2-pos-param \ + test/parser/test-grub2-search-args \ test/parser/test-grub2-load-env \ test/parser/test-grub2-save-env \ test/parser/test-grub2-save-env-dash-f \ diff --git a/test/parser/test-grub2-search-args.c b/test/parser/test-grub2-search-args.c new file mode 100644 index 0000000..ffce853 --- /dev/null +++ b/test/parser/test-grub2-search-args.c @@ -0,0 +1,33 @@ + +/* check for multiple styles of option parsing for the 'search' command */ + +#include "parser-test.h" + +#if 0 /* PARSER_EMBEDDED_CONFIG */ + +# no --set arugment will set the 'root' var +search a +search --set=v1 b +search --set v2 c + +menuentry $root$v1$v2 { + linux /vmlinux +} + +#endif + +void run_test(struct parser_test *test) +{ + struct discover_boot_option *opt; + struct discover_context *ctx; + + ctx = test->ctx; + + test_read_conf_embedded(test, "/grub/grub.cfg"); + + test_run_parser(test, "grub2"); + + check_boot_option_count(ctx, 1); + opt = get_boot_option(ctx, 0); + check_name(opt, "abc"); +}