X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fpxe-parser.c;h=00f3b31c20c514e64f7d0049dc911bb9465034e9;hp=17ae55e6a3dc0c5665be7e7678a308dddf6ecf0d;hb=c1359507c1556ba5f6d2afd0e401abcfe66f02a9;hpb=30dce4ce0447802e3b54b3f760c5fd8eacbe75ff diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index 17ae55e..00f3b31 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); } }