X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fpxe-parser.c;h=aef43b8cdfc06737ad72d06fc7f76a4c1670473f;hb=9f191cc3c194ed51534c22e2dae15b2c08c8abc2;hp=75d7e7e0b51cdadef245caf5d972a31eaee9696e;hpb=f00b8c2d08e4ef57f2da0ed3b1701ed50331b91d;p=petitboot diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index 75d7e7e..aef43b8 100644 --- a/discover/pxe-parser.c +++ b/discover/pxe-parser.c @@ -148,7 +148,7 @@ static void pxe_process_pair(struct conf_context *ctx, return; } - if (streq(name, "LABEL")) { + if (streq(name, "LABEL") || streq(name, "PLUGIN")) { if (opt) pxe_finish(ctx); @@ -158,8 +158,12 @@ static void pxe_process_pair(struct conf_context *ctx, opt->option->id = talloc_asprintf(opt, "%s@%p", ctx->dc->device->device->id, opt); - opt->option->is_default = parser_info->default_name && - streq(parser_info->default_name, value); + if (streq(name, "LABEL")) { + opt->option->type = DISCOVER_BOOT_OPTION; + opt->option->is_default = parser_info->default_name && + streq(parser_info->default_name, value); + } else + opt->option->type = DISCOVER_PLUGIN_OPTION; parser_info->opt = opt; return; @@ -169,6 +173,14 @@ static void pxe_process_pair(struct conf_context *ctx, if (!opt) return; + if (streq(name, "TARBALL") && + opt->option->type == DISCOVER_PLUGIN_OPTION) { + url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value); + opt->boot_image = create_url_resource(opt, url); + /* All other options apply to boot options only */ + return; + } + if (streq(name, "KERNEL")) { url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value); opt->boot_image = create_url_resource(opt, url); @@ -210,7 +222,6 @@ static void pxe_process_pair(struct conf_context *ctx, url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value); opt->dtb = create_url_resource(opt, url); } - } static void pxe_load_next_filename(struct conf_context *conf) @@ -227,7 +238,8 @@ static void pxe_load_next_filename(struct conf_context *conf) if (!url) continue; - if (load_url_async(conf, url, pxe_conf_parse_cb, conf)) + if (load_url_async(conf, url, pxe_conf_parse_cb, conf, + NULL, NULL)) break; } @@ -250,18 +262,29 @@ static void pxe_conf_parse_cb(struct load_url_result *result, void *data) if (!data) return; + handler = talloc_parent(conf); + if (result && result->status == LOAD_OK) rc = read_file(conf, result->local, &buf, &len); if (!result || result->status != LOAD_OK || rc) { /* This load failed so try the next available filename */ info = conf->parser_info; - if (!info->pxe_conf_files) + if (!info->pxe_conf_files) { + device_handler_status_dev_err(handler, + conf->dc->device, + _("Failed to download %s"), + pb_url_to_string(result->url)); + return; + } info->current++; pxe_load_next_filename(conf); if (info->pxe_conf_files[info->current] == NULL) { /* Nothing left to try */ + device_handler_status_dev_err(handler, + conf->dc->device, + _("PXE autoconfiguration failed")); goto out_clean; } return; @@ -277,7 +300,6 @@ static void pxe_conf_parse_cb(struct load_url_result *result, void *data) /* We may be called well after the original caller of iterate_parsers(), * commit any new boot options ourselves */ - handler = talloc_parent(conf); device_handler_discover_context_commit(handler, conf->dc); /* @@ -286,7 +308,7 @@ static void pxe_conf_parse_cb(struct load_url_result *result, void *data) */ device_handler_status_dev_info(handler, conf->dc->device, _("Parsed PXE config from %s"), - pb_url_to_string(conf->dc->conf_url)); + pb_url_to_string(result->url)); talloc_free(buf); out_clean: @@ -370,11 +392,14 @@ static int pxe_parse(struct discover_context *dc) /* we have a complete URL; use this and we're done. */ result = load_url_async(conf->dc, conf->dc->conf_url, - pxe_conf_parse_cb, conf); + pxe_conf_parse_cb, conf, NULL, ctx); if (!result) { pb_log("load_url_async fails for %s\n", dc->conf_url->path); goto out_conf; + } else if (result->status == LOAD_OK) { + /* Local load - call pxe_conf_parse_cb() now */ + pxe_conf_parse_cb(result, conf); } } else { pxe_conf_files = user_event_parse_conf_filenames(dc, dc->event);