diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-03-18 14:23:23 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-04-29 14:41:04 +1000 |
commit | 45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef (patch) | |
tree | 2753fb3912c07d23f3e2f622c05043f55c8f24c9 /discover/parser.c | |
parent | 5444648fe1ff9b79f3db5ee6feadd51341f59d71 (diff) | |
download | talos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.tar.gz talos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.zip |
parsers: dynamically register parsers
Currently, we require all parsers to be defined in an array in
parsers.c.
This change removes this requirement, by introducting a
register_parser() macro, which adds a constructor to register the parser
with the core parser infrastructure.
Because each parser no longer resolves an undefined symbol, we need to
use a `ld -r` object for libparser, instead of using libtool, which
creates a .a (and hence has no parsers included).
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/parser.c')
-rw-r--r-- | discover/parser.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/discover/parser.c b/discover/parser.c index 0df8a73..641e06b 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -13,18 +13,8 @@ #include "parser-utils.h" #include "paths.h" -struct parser __grub2_parser; -struct parser __kboot_parser; -struct parser __native_parser; -struct parser __yaboot_parser; - -static struct parser *const parsers[] = { -// &__native_parser, - &__kboot_parser, - &__grub2_parser, - &__yaboot_parser, - NULL -}; +static int n_parsers; +static struct parser **parsers; static const int max_file_size = 1024 * 1024; @@ -114,7 +104,7 @@ void iterate_parsers(struct discover_context *ctx) pb_log("trying parsers for %s\n", ctx->device->device->id); - for (i = 0; parsers[i]; i++) { + for (i = 0; i < n_parsers; i++) { pb_log("\ttrying parser '%s'\n", parsers[i]->name); ctx->parser = parsers[i]; iterate_parser_files(ctx, parsers[i]); @@ -122,6 +112,13 @@ void iterate_parsers(struct discover_context *ctx) ctx->parser = NULL; } +void __register_parser(struct parser *parser) +{ + parsers = talloc_realloc(NULL, parsers, struct parser *, n_parsers + 1); + parsers[n_parsers] = parser; + n_parsers++; +} + void parser_init(void) { } |