X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fpxe-parser.c;h=ca0f4b543ef09a6bbc9e4a4eb0db0680e8d96154;hp=c300b697d0eeb769ab4986bc9e06397d4071cae6;hb=15c8cadd1173f681142a3f48319a203d7b917850;hpb=263e31240d97484619f55630f625257dc874c5d0 diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index c300b69..ca0f4b5 100644 --- a/discover/pxe-parser.c +++ b/discover/pxe-parser.c @@ -1,4 +1,5 @@ +#define _GNU_SOURCE #include #include @@ -11,8 +12,8 @@ static void pxe_finish(struct conf_context *conf) { - printf("%s\n", __func__); - discover_context_add_boot_option(conf->dc, conf->parser_info); + if (conf->parser_info) + discover_context_add_boot_option(conf->dc, conf->parser_info); } static void pxe_process_pair(struct conf_context *ctx, @@ -21,6 +22,16 @@ static void pxe_process_pair(struct conf_context *ctx, struct discover_boot_option *opt = ctx->parser_info; struct pb_url *url; + /* quirk in the syslinux config format: initrd can be separated + * by an '=' */ + if (!name && !strncasecmp(value, "initrd=", strlen("initrd="))) { + name = "initrd"; + value += strlen("initrd="); + } + + if (!name) + return; + if (streq(name, "LABEL")) { if (opt) pxe_finish(ctx); @@ -42,10 +53,26 @@ static void pxe_process_pair(struct conf_context *ctx, url = pb_url_join(ctx->dc, ctx->dc->conf_url, value); opt->boot_image = create_url_resource(opt, url); + } else if (streq(name, "INITRD")) { + url = pb_url_join(ctx->dc, ctx->dc->conf_url, value); + opt->initrd = create_url_resource(opt, url); + } else if (streq(name, "APPEND")) { + char *str, *end; + opt->option->boot_args = talloc_strdup(opt->option, value); - /* todo: initrd extraction */ + + str = strcasestr(value, "INITRD="); + if (str) { + str += strlen("INITRD="); + end = strchrnul(str, ' '); + *end = '\0'; + + url = pb_url_join(ctx->dc, ctx->dc->conf_url, str); + opt->initrd = create_url_resource(opt, url); + } } + } static int pxe_parse(struct discover_context *dc, char *buf, int len)