diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2014-02-27 13:54:32 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-02-27 13:54:32 +0800 |
commit | f94ca3311758854670d25ba4e7853d76c2113402 (patch) | |
tree | 8ea7d571a5c986bb93f11b03f6a8eec8e74cd057 /discover | |
parent | 922756a3aefd8ba5c5675efd37df9f43938cf432 (diff) | |
download | talos-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.c | 44 |
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); } } |