diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-03-19 15:42:51 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-04-29 14:48:09 +1000 |
commit | a51e41eb1d2545b7eb03ff02604225b9594b11e7 (patch) | |
tree | 24b7f2f8da537fecc9b146988197147495eff07f /discover | |
parent | 19dab336ae13f0476bfbf0db34f1329a802eeb8e (diff) | |
download | talos-petitboot-a51e41eb1d2545b7eb03ff02604225b9594b11e7.tar.gz talos-petitboot-a51e41eb1d2545b7eb03ff02604225b9594b11e7.zip |
discover: Add PXE parser
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover')
-rw-r--r-- | discover/Makefile.am | 3 | ||||
-rw-r--r-- | discover/pxe-parser.c | 78 |
2 files changed, 80 insertions, 1 deletions
diff --git a/discover/Makefile.am b/discover/Makefile.am index 8cbb0af..ce8cff5 100644 --- a/discover/Makefile.am +++ b/discover/Makefile.am @@ -32,7 +32,8 @@ libparser_o_SOURCES = \ resource.h \ kboot-parser.c \ grub2-parser.c \ - yaboot-parser.c + yaboot-parser.c \ + pxe-parser.c libparser.o: $(libparser_o_OBJECTS) $(LD) -r -o $@ $^ diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c new file mode 100644 index 0000000..662716a --- /dev/null +++ b/discover/pxe-parser.c @@ -0,0 +1,78 @@ + +#include <string.h> + +#include <talloc/talloc.h> +#include <url/url.h> + +#include "parser.h" +#include "parser-conf.h" +#include "parser-utils.h" +#include "resource.h" + +static void pxe_finish(struct conf_context *conf) +{ + printf("%s\n", __func__); + discover_context_add_boot_option(conf->dc, conf->parser_info); +} + +static void pxe_process_pair(struct conf_context *ctx, + const char *name, char *value) +{ + struct discover_boot_option *opt = ctx->parser_info; + struct pb_url *url; + + if (streq(name, "LABEL")) { + if (opt) + pxe_finish(ctx); + + opt = discover_boot_option_create(ctx->dc, ctx->dc->device); + ctx->parser_info = opt; + + opt->option->device_id = ctx->dc->device->device->id; + opt->option->name = talloc_strdup(opt, value); + opt->option->id = talloc_asprintf(opt, "%s@%p", + opt->option->device_id, opt); + return; + } + + /* all other parameters need an option */ + if (!opt) + return; + + if (streq(name, "KERNEL")) { + url = pb_url_join(ctx->dc, ctx->dc->conf_url, value); + opt->boot_image = create_url_resource(opt, url); + + } else if (streq(name, "APPEND")) { + opt->option->boot_args = talloc_strdup(opt->option, value); + /* todo: initrd extraction */ + } +} + +static int pxe_parse(struct discover_context *dc, char *buf, int len) +{ + struct conf_context *conf; + + conf = talloc_zero(dc, struct conf_context); + + if (!conf) + return 0; + + conf->dc = dc; + conf->get_pair = conf_get_pair_space; + conf->process_pair = pxe_process_pair; + conf->finish = pxe_finish; + + conf_parse_buf(conf, buf, len); + + talloc_free(conf); + return 1; +} + +static struct parser pxe_parser = { + .name = "pxe", + .parse = pxe_parse, + .method = CONF_METHOD_DHCP, +}; + +register_parser(pxe_parser); |