discover/grub2: Add support for -s and -f commands
authorJeremy Kerr <jk@ozlabs.org>
Wed, 27 Nov 2013 10:56:16 +0000 (18:56 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Wed, 27 Nov 2013 10:56:16 +0000 (18:56 +0800)
Implement -s and -f checks for grub, and test with the standard GRUB2
saved_default config.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/grub2/builtins.c
test/parser/Makefile.am
test/parser/test-grub2-saved-default.c [new file with mode: 0644]

index 668ed93aa10e6db074d3a7736d473f21446085dc..75110760082ec51324f685e5c5b84bebac5e5745 100644 (file)
@@ -7,6 +7,7 @@
 #include <talloc/talloc.h>
 #include <util/util.h>
 
 #include <talloc/talloc.h>
 #include <util/util.h>
 
+#include "discover/parser.h"
 #include "grub2.h"
 
 
 #include "grub2.h"
 
 
@@ -123,7 +124,38 @@ static int builtin_search(struct grub2_script *script,
        return 0;
 }
 
        return 0;
 }
 
-static bool builtin_test_op(int argc, char **argv, int *consumed)
+static bool builtin_test_op_file(struct grub2_script *script, char op,
+               const char *file)
+{
+       bool result;
+       int len, rc;
+       char *buf;
+
+       rc = parser_request_file(script->ctx, script->ctx->device,
+                       file, &buf, &len);
+       if (rc)
+               return false;
+
+       switch (op) {
+       case 's':
+               /* -s: return true if file exists and has non-zero size */
+               result = len > 0;
+               break;
+       case 'f':
+               /* -f: return true if file exists */
+               result = true;
+               break;
+       default:
+               result = false;
+
+       }
+
+       talloc_free(buf);
+       return result;
+}
+
+static bool builtin_test_op(struct grub2_script *script,
+               int argc, char **argv, int *consumed)
 {
        char *op;
 
 {
        char *op;
 
@@ -171,10 +203,9 @@ static bool builtin_test_op(int argc, char **argv, int *consumed)
                        return strlen(a1) != 0;
                }
 
                        return strlen(a1) != 0;
                }
 
-               /* todo: implement file checks */
                if (!strcmp(op, "-s") || !strcmp(op, "-f")) {
                        *consumed = 2;
                if (!strcmp(op, "-s") || !strcmp(op, "-f")) {
                        *consumed = 2;
-                       return false;
+                       return builtin_test_op_file(script, op[1], a1);
                }
        }
 
                }
        }
 
@@ -183,7 +214,7 @@ static bool builtin_test_op(int argc, char **argv, int *consumed)
        return strlen(op) > 0;
 }
 
        return strlen(op) > 0;
 }
 
-static int builtin_test(struct grub2_script *script __attribute__((unused)),
+static int builtin_test(struct grub2_script *script,
                void *data __attribute__((unused)),
                int argc, char *argv[])
 {
                void *data __attribute__((unused)),
                int argc, char *argv[])
 {
@@ -222,7 +253,7 @@ static int builtin_test(struct grub2_script *script __attribute__((unused)),
                        continue;
                }
 
                        continue;
                }
 
-               rc = builtin_test_op(argc, argv, &consumed);
+               rc = builtin_test_op(script, argc, argv, &consumed);
                if (not) {
                        rc = !rc;
                        not = false;
                if (not) {
                        rc = !rc;
                        not = false;
index dbf626a42fed755e581db4efafe6f0d42b65e775..e355af3e11ecd95dddd86b6b2bf0f3f392249f0e 100644 (file)
@@ -35,6 +35,7 @@ TESTS = \
        test-grub2-single-line-if \
        test-grub2-load-env \
        test-grub2-save-env \
        test-grub2-single-line-if \
        test-grub2-load-env \
        test-grub2-save-env \
+       test-grub2-saved-default \
        test-grub2-f18-ppc64 \
        test-grub2-ubuntu-13_04-x86 \
        test-grub2-lexer-error \
        test-grub2-f18-ppc64 \
        test-grub2-ubuntu-13_04-x86 \
        test-grub2-lexer-error \
diff --git a/test/parser/test-grub2-saved-default.c b/test/parser/test-grub2-saved-default.c
new file mode 100644 (file)
index 0000000..c1f6478
--- /dev/null
@@ -0,0 +1,47 @@
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+if [ "${next_entry}" ] ; then
+   set default="${next_entry}"
+   set next_entry=
+   save_env next_entry
+   set boot_once=true
+else
+   set default="${saved_entry}"
+fi
+menuentry 'test saved option' {
+       linux   vmlinux
+}
+#endif
+
+
+
+void run_test(struct parser_test *test)
+{
+       struct discover_boot_option *opt;
+       struct discover_context *ctx;
+
+       test_add_file_string(test, test->ctx->device,
+                               "/boot/grub/grubenv",
+                               "# GRUB Environment Block\n"
+                               "saved_entry=test saved option\n"
+                               "#############################");
+
+       test_read_conf_embedded(test, "/boot/grub/grub.cfg");
+
+       test_run_parser(test, "grub2");
+
+       ctx = test->ctx;
+
+       check_boot_option_count(ctx, 1);
+       opt = get_boot_option(ctx, 0);
+
+       check_name(opt, "test saved option");
+       check_resolved_local_resource(opt->boot_image, ctx->device,
+                       "/vmlinux");
+       check_is_default(opt);
+}