]> git.ozlabs.org Git - petitboot/blobdiff - discover/grub2/grub2.c
discover/grub2: Allow URL resources
[petitboot] / discover / grub2 / grub2.c
index ebc6ac7b6d72383d24efc29a1c08bf11cf2b8d6f..22d42dfc432a093d776a03b4109847413a66077b 100644 (file)
@@ -2,6 +2,7 @@
 #include <assert.h>
 
 #include <talloc/talloc.h>
+#include <url/url.h>
 
 #include <discover/resource.h>
 #include <discover/parser.h>
@@ -31,24 +32,30 @@ static const char *const grub2_conf_files[] = {
 };
 
 struct grub2_resource_info {
-       struct grub2_root *root;
+       char *root;
        char *path;
 };
 
 /* we use slightly different resources for grub2 */
-struct resource *create_grub2_resource(void *ctx,
+struct resource *create_grub2_resource(struct discover_boot_option *opt,
                struct discover_device *orig_device,
-               struct grub2_root *root, const char *path)
+               const char *root, const char *path)
 {
        struct grub2_resource_info *info;
        struct resource *res;
 
-       res = talloc(ctx, struct resource);
+       if (strstr(path, "://")) {
+               struct pb_url *url = pb_url_parse(opt, path);
+               if (url)
+                       return create_url_resource(opt, url);
+       }
+
+       res = talloc(opt, struct resource);
 
        if (root) {
                info = talloc(res, struct grub2_resource_info);
-               info->root = root;
                talloc_reference(info, root);
+               info->root = talloc_strdup(info, root);
                info->path = talloc_strdup(info, path);
 
                res->resolved = false;
@@ -68,7 +75,7 @@ bool resolve_grub2_resource(struct device_handler *handler,
 
        assert(!res->resolved);
 
-       dev = device_lookup_by_uuid(handler, info->root->uuid);
+       dev = device_lookup_by_uuid(handler, info->root);
 
        if (!dev)
                return false;