]> git.ozlabs.org Git - petitboot/blobdiff - discover/device-handler.c
discover/event: Ensure event struct exists for async callers
[petitboot] / discover / device-handler.c
index 682a4e9ae865944d4acea0c62c5b9418ffe36227..346cb0221d7f08e8b5bcbd7b72f33c596f344f8b 100644 (file)
@@ -613,6 +613,7 @@ static bool __attribute__((used)) boot_option_is_resolved(
        return resource_is_resolved(opt->boot_image) &&
                resource_is_resolved(opt->initrd) &&
                resource_is_resolved(opt->dtb) &&
+               resource_is_resolved(opt->args_sig_file) &&
                resource_is_resolved(opt->icon);
 }
 
@@ -638,6 +639,8 @@ static bool boot_option_resolve(struct discover_boot_option *opt,
        return resource_resolve(opt->boot_image, "boot_image", opt, handler) &&
                resource_resolve(opt->initrd, "initrd", opt, handler) &&
                resource_resolve(opt->dtb, "dtb", opt, handler) &&
+               resource_resolve(opt->args_sig_file, "args_sig_file", opt,
+                       handler) &&
                resource_resolve(opt->icon, "icon", opt, handler);
 }
 
@@ -652,6 +655,7 @@ static void boot_option_finalise(struct device_handler *handler,
        assert(!opt->option->dtb_file);
        assert(!opt->option->icon_file);
        assert(!opt->option->device_id);
+       assert(!opt->option->args_sig_file);
 
        if (opt->boot_image)
                opt->option->boot_image_file = opt->boot_image->url->full;
@@ -661,6 +665,8 @@ static void boot_option_finalise(struct device_handler *handler,
                opt->option->dtb_file = opt->dtb->url->full;
        if (opt->icon)
                opt->option->icon_file = opt->icon->url->full;
+       if (opt->args_sig_file)
+               opt->option->args_sig_file = opt->args_sig_file->url->full;
 
        opt->option->device_id = opt->device->device->id;
 
@@ -894,6 +900,7 @@ int device_handler_dhcp(struct device_handler *handler,
 
        /* create our context */
        ctx = device_handler_discover_context_create(handler, dev);
+       talloc_steal(ctx, event);
        ctx->event = event;
 
        iterate_parsers(ctx);
@@ -1165,6 +1172,7 @@ void device_handler_process_url(struct device_handler *handler,
        if (pb_url->scheme == pb_url_file)
                dev->device->type = DEVICE_TYPE_ANY;
        ctx = device_handler_discover_context_create(handler, dev);
+       talloc_steal(ctx, event);
        ctx->event = event;
 
        iterate_parsers(ctx);
@@ -1581,6 +1589,41 @@ void device_release_write(struct discover_device *dev, bool release)
                dev->mounted = true;
 }
 
+void device_sync_snapshots(struct device_handler *handler, const char *device)
+{
+       struct discover_device *dev = NULL;
+       unsigned int i;
+
+       if (device) {
+               /* Find matching device and sync */
+               dev = device_lookup_by_name(handler, device);
+               if (!dev) {
+                       pb_log("%s: device name '%s' unrecognised\n",
+                               __func__, device);
+                       return;
+               }
+               if (dev->ramdisk)
+                       device_release_write(dev, true);
+               else
+                       pb_log("%s has no snapshot to merge, skipping\n",
+                               dev->device->id);
+               return;
+       }
+
+       /* Otherwise sync all relevant devices */
+       for (i = 0; i < handler->n_devices; i++) {
+               dev = handler->devices[i];
+               if (dev->device->type != DEVICE_TYPE_DISK &&
+                       dev->device->type != DEVICE_TYPE_USB)
+                       continue;
+               if (dev->ramdisk)
+                       device_release_write(dev, true);
+               else
+                       pb_log("%s has no snapshot to merge, skipping\n",
+                               dev->device->id);
+       }
+}
+
 #else
 
 void device_handler_discover_context_commit(
@@ -1628,4 +1671,10 @@ void device_release_write(struct discover_device *dev __attribute__((unused)),
 {
 }
 
+void device_sync_snapshots(
+               struct device_handler *handler __attribute__((unused)),
+               const char *device __attribute__((unused)))
+{
+}
+
 #endif