From 30dce4ce0447802e3b54b3f760c5fd8eacbe75ff Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 27 Feb 2014 10:33:13 +0800 Subject: discover/pxe: Add pxelinux.cfg/ directory to autodiscovered pxe paths The pxelinux project will perform autodiscovery by looking for files under the pxelinux.cfg/ prefix (in addition to any pxepathprefix from DHCP option 210) This change unifies petitboot's behaviour with pxelinux. Signed-off-by: Jeremy Kerr --- discover/pxe-parser.c | 22 +++++++++++++--------- test/parser/test-pxe-ip-without-conf.c | 2 +- test/parser/test-pxe-mac-without-conf.c | 2 +- test/parser/test-pxe-pathprefix-discover-mac.c | 6 ++++-- test/parser/test-pxe-pathprefix-discover.c | 6 ++++-- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index e245f1b..17ae55e 100644 --- a/discover/pxe-parser.c +++ b/discover/pxe-parser.c @@ -14,6 +14,8 @@ #include "paths.h" #include "user-event.h" +static const char *pxelinux_prefix = "pxelinux.cfg/"; + struct pxe_parser_info { struct discover_boot_option *opt; const char *default_name; @@ -97,9 +99,9 @@ static void pxe_process_pair(struct conf_context *ctx, static int pxe_parse(struct discover_context *dc) { + struct pb_url *pxe_base_url, *url; struct pxe_parser_info *parser_info; char **pxe_conf_files, **filename; - struct pb_url *conf_url, *url; struct conf_context *conf; bool complete_url; int len, rc; @@ -122,13 +124,12 @@ static int pxe_parse(struct discover_context *dc) parser_info = talloc_zero(conf, struct pxe_parser_info); conf->parser_info = parser_info; - conf_url = user_event_parse_conf_url(dc, dc->event, &complete_url); - if (!conf_url) + dc->conf_url = user_event_parse_conf_url(dc, dc->event, &complete_url); + if (!dc->conf_url) goto out_conf; if (complete_url) { /* we have a complete URL; use this and we're done. */ - dc->conf_url = conf_url; rc = parser_request_url(dc, dc->conf_url, &buf, &len); if (rc) goto out_conf; @@ -139,10 +140,14 @@ static int pxe_parse(struct discover_context *dc) rc = -1; + pxe_base_url = pb_url_join(dc, dc->conf_url, pxelinux_prefix); + if (!pxe_base_url) + goto out_pxe_conf; + for (filename = pxe_conf_files; *filename; filename++) { - url = pb_url_join(dc, conf_url, *filename); + url = pb_url_join(dc, pxe_base_url, *filename); if (!url) - goto out_pxe_conf; + continue; rc = parser_request_url(dc, url, &buf, &len); if (!rc) /* found one, just break */ @@ -151,13 +156,12 @@ static int pxe_parse(struct discover_context *dc) talloc_free(url); } + talloc_free(pxe_base_url); + /* No configuration file found on the boot server */ if (rc) goto out_pxe_conf; - dc->conf_url = url; - - talloc_free(conf_url); talloc_free(pxe_conf_files); } diff --git a/test/parser/test-pxe-ip-without-conf.c b/test/parser/test-pxe-ip-without-conf.c index ff3bf9e..e3a612a 100644 --- a/test/parser/test-pxe-ip-without-conf.c +++ b/test/parser/test-pxe-ip-without-conf.c @@ -15,7 +15,7 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; - test_read_conf_embedded_url(test, "tftp://host/dir/C0A8"); + test_read_conf_embedded_url(test, "tftp://host/dir/pxelinux.cfg/C0A8"); test_set_event_source(test); test_set_event_param(test->ctx->event, "bootfile", "dir/pxe"); diff --git a/test/parser/test-pxe-mac-without-conf.c b/test/parser/test-pxe-mac-without-conf.c index e42e374..f84d63b 100644 --- a/test/parser/test-pxe-mac-without-conf.c +++ b/test/parser/test-pxe-mac-without-conf.c @@ -16,7 +16,7 @@ void run_test(struct parser_test *test) struct discover_context *ctx; test_read_conf_embedded_url(test, - "tftp://host/dir/01-12-34-56-78-9a-bc"); + "tftp://host/dir/pxelinux.cfg/01-12-34-56-78-9a-bc"); test_set_event_source(test); test_set_event_param(test->ctx->event, "bootfile", "dir/pxe"); diff --git a/test/parser/test-pxe-pathprefix-discover-mac.c b/test/parser/test-pxe-pathprefix-discover-mac.c index 2decb46..1e5fa71 100644 --- a/test/parser/test-pxe-pathprefix-discover-mac.c +++ b/test/parser/test-pxe-pathprefix-discover-mac.c @@ -16,7 +16,8 @@ void run_test(struct parser_test *test) struct discover_context *ctx; test_read_conf_embedded_url(test, - "tftp://host/path/to/01-12-34-56-78-9a-bc"); + "tftp://host/path/to/pxelinux.cfg/" + "01-12-34-56-78-9a-bc"); test_set_event_source(test); test_set_event_param(test->ctx->event, "mac", "12:34:56:78:9a:bc"); @@ -35,5 +36,6 @@ void run_test(struct parser_test *test) check_resolved_url_resource(opt->boot_image, "tftp://host/path/to/./kernel"); - check_resolved_url_resource(opt->initrd, "tftp://host/initrd"); + check_resolved_url_resource(opt->initrd, + "tftp://host/initrd"); } diff --git a/test/parser/test-pxe-pathprefix-discover.c b/test/parser/test-pxe-pathprefix-discover.c index de2feac..9cb44c8 100644 --- a/test/parser/test-pxe-pathprefix-discover.c +++ b/test/parser/test-pxe-pathprefix-discover.c @@ -15,7 +15,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; - test_read_conf_embedded_url(test, "tftp://host/path/to/C0A8"); + test_read_conf_embedded_url(test, + "tftp://host/path/to/pxelinux.cfg/C0A8"); test_set_event_source(test); test_set_event_param(test->ctx->event, "ip", "192.168.0.1"); @@ -34,5 +35,6 @@ void run_test(struct parser_test *test) check_resolved_url_resource(opt->boot_image, "tftp://host/path/to/./kernel"); - check_resolved_url_resource(opt->initrd, "tftp://host/initrd"); + check_resolved_url_resource(opt->initrd, + "tftp://host/initrd"); } -- cgit v1.2.1