diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-11-27 18:56:16 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-11-27 18:56:16 +0800 |
commit | 13e41764a7450302b874668bc1a3fbf6be25b781 (patch) | |
tree | 430c5061b4a64ef3bc7c7c5b425d331f3fff462e /discover/grub2 | |
parent | d67d5beceef94686818ce264b2ca93f82b66e8f4 (diff) | |
download | petitboot-13e41764a7450302b874668bc1a3fbf6be25b781.zip petitboot-13e41764a7450302b874668bc1a3fbf6be25b781.tar.gz |
discover/grub2: Add support for -s and -f commands
Implement -s and -f checks for grub, and test with the standard GRUB2
saved_default config.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/grub2')
-rw-r--r-- | discover/grub2/builtins.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/discover/grub2/builtins.c b/discover/grub2/builtins.c index 668ed93..7511076 100644 --- a/discover/grub2/builtins.c +++ b/discover/grub2/builtins.c @@ -7,6 +7,7 @@ #include <talloc/talloc.h> #include <util/util.h> +#include "discover/parser.h" #include "grub2.h" @@ -123,7 +124,38 @@ static int builtin_search(struct grub2_script *script, 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; @@ -171,10 +203,9 @@ static bool builtin_test_op(int argc, char **argv, int *consumed) return strlen(a1) != 0; } - /* todo: implement file checks */ 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; } -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[]) { @@ -222,7 +253,7 @@ static int builtin_test(struct grub2_script *script __attribute__((unused)), continue; } - rc = builtin_test_op(argc, argv, &consumed); + rc = builtin_test_op(script, argc, argv, &consumed); if (not) { rc = !rc; not = false; |