From a51e41eb1d2545b7eb03ff02604225b9594b11e7 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 19 Mar 2013 15:42:51 +0800 Subject: [PATCH] discover: Add PXE parser Signed-off-by: Jeremy Kerr --- discover/Makefile.am | 3 +- discover/pxe-parser.c | 78 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 discover/pxe-parser.c 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 + +#include +#include + +#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); -- 2.39.2