summaryrefslogtreecommitdiffstats
path: root/discover
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2014-02-27 13:54:32 +0800
committerJeremy Kerr <jk@ozlabs.org>2014-02-27 13:54:32 +0800
commitf94ca3311758854670d25ba4e7853d76c2113402 (patch)
tree8ea7d571a5c986bb93f11b03f6a8eec8e74cd057 /discover
parent922756a3aefd8ba5c5675efd37df9f43938cf432 (diff)
downloadtalos-petitboot-f94ca3311758854670d25ba4e7853d76c2113402.tar.gz
talos-petitboot-f94ca3311758854670d25ba4e7853d76c2113402.zip
discover/pxe: pxe parser should only treat "::" paths as absolute
PXELinux treats all paths as relative, requiring a "::/path" syntax for truly absolute URLs. This change implements the same behaviour in petitboot, and updates the testcases to suit. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover')
-rw-r--r--discover/pxe-parser.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c
index 17ae55e..98e1603 100644
--- a/discover/pxe-parser.c
+++ b/discover/pxe-parser.c
@@ -28,6 +28,44 @@ static void pxe_finish(struct conf_context *conf)
discover_context_add_boot_option(conf->dc, info->opt);
}
+/* We need a slightly modified version of pb_url_join, to allow for the
+ * pxelinux "::filename" syntax for absolute URLs
+ */
+static struct pb_url *pxe_url_join(void *ctx, const struct pb_url *url,
+ const char *s)
+{
+ struct pb_url *new_url;
+ int len;
+
+ len = strlen(s);
+
+ if (len > 2 && s[0] == ':' && s[1] == ':') {
+ char *tmp;
+
+ if (s[2] == '/') {
+ /* ::/path -> /path */
+ tmp = talloc_strdup(ctx, s+2);
+ } else {
+ /* ::path -> /path */
+ tmp = talloc_strdup(ctx, s+1);
+ tmp[0] = '/';
+ }
+
+ new_url = pb_url_join(ctx, url, tmp);
+
+ talloc_free(tmp);
+
+ } else {
+ const char *tmp;
+ /* strip leading slashes */
+ for (tmp = s; *tmp == '/'; tmp++);
+ ;
+ new_url = pb_url_join(ctx, url, tmp);
+ }
+
+ return new_url;
+}
+
static void pxe_process_pair(struct conf_context *ctx,
const char *name, char *value)
{
@@ -72,11 +110,11 @@ static void pxe_process_pair(struct conf_context *ctx,
return;
if (streq(name, "KERNEL")) {
- url = pb_url_join(ctx->dc, ctx->dc->conf_url, value);
+ url = pxe_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);
+ url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value);
opt->initrd = create_url_resource(opt, url);
} else if (streq(name, "APPEND")) {
@@ -90,7 +128,7 @@ static void pxe_process_pair(struct conf_context *ctx,
end = strchrnul(str, ' ');
*end = '\0';
- url = pb_url_join(ctx->dc, ctx->dc->conf_url, str);
+ url = pxe_url_join(ctx->dc, ctx->dc->conf_url, str);
opt->initrd = create_url_resource(opt, url);
}
}
OpenPOWER on IntegriCloud