mac = event_get_param(event, "mac");
char *url = talloc_asprintf(event, "file://%s", result->local);
- event_set_param(event, "pxeconffile", url);
+ event_set_param(event, "pxeconffile-local", url);
dev = discover_device_create(handler, mac, event->device);
ctx = device_handler_discover_context_create(handler, dev);
static int pxe_parse(struct discover_context *dc)
{
- struct pb_url *pxe_base_url;
+ struct pb_url *pxe_base_url, *file_url;
struct conf_context *conf = NULL;
struct load_url_result *result;
void *ctx = talloc_parent(dc);
return -1;
if (complete_url) {
+ /* Check if this file has already been downloaded */
+ if (event_get_param(dc->event, "pxeconffile-local"))
+ file_url = pb_url_parse(dc, event_get_param(dc->event,
+ "pxeconffile-local"));
+ else
+ file_url = dc->conf_url;
+
+ if (!file_url) {
+ pb_log("%s: Failed to parse conf url!\n", __func__);
+ goto out_conf;
+ }
+
device_handler_status_dev_info(conf->dc->handler,
dc->device,
_("Requesting config %s"),
pb_url_to_string(conf->dc->conf_url));
/* we have a complete URL; use this and we're done. */
- result = load_url_async(conf->dc, conf->dc->conf_url,
+ result = load_url_async(conf->dc, file_url,
pxe_conf_parse_cb, conf, NULL, ctx);
if (!result) {
pb_log("load_url_async fails for %s\n",
test/parser/test-pxe-discover-bootfile-pathprefix \
test/parser/test-pxe-discover-bootfile-relative-conffile \
test/parser/test-pxe-discover-bootfile-absolute-conffile \
+ test/parser/test-pxe-discover-bootfile-async-file \
test/parser/test-unresolved-remove
TESTS += $(parser_TESTS)
--- /dev/null
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+label linux
+kernel vmlinux
+initrd initrd
+#endif
+
+/**
+ * Manually specified conf files will be downloaded locally before being passed
+ * to the parser. Check that the parser correctly resolves relative paths to the
+ * actual source, rather than the local file path.
+ */
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_read_conf_embedded_url(test, "file://tmp/conf.txt");
+
+ test_set_event_source(test);
+ test_set_event_param(test->ctx->event, "pxeconffile",
+ "tftp://host/dir/fail.txt");
+ test_set_event_param(test->ctx->event, "pxeconffile-local",
+ "file://tmp/conf.txt");
+
+ test_run_parser(test, "pxe");
+
+ ctx = test->ctx;
+
+ check_boot_option_count(ctx, 1);
+ opt = get_boot_option(ctx, 0);
+
+ check_name(opt, "linux");
+
+ check_resolved_url_resource(opt->boot_image,
+ "tftp://host/dir/vmlinux");
+ check_resolved_url_resource(opt->initrd,
+ "tftp://host/dir/initrd");
+}