- struct list unresolved_boot_options;
-};
-
-static bool resource_is_resolved(struct resource *res)
-{
- return !res || res->resolved;
-}
-
-/* We only use this in an assert, which will disappear if we're compiling
- * with NDEBUG, so we need the 'used' attribute for these builds */
-static bool __attribute__((used)) boot_option_is_resolved(
- struct discover_boot_option *opt)
-{
- return resource_is_resolved(opt->boot_image) &&
- resource_is_resolved(opt->initrd) &&
- resource_is_resolved(opt->icon);
-}
-
-static bool resource_resolve(struct resource *res, struct parser *parser,
- struct device_handler *handler)
-{
- if (resource_is_resolved(res))
- return true;
-
- parser->resolve_resource(handler, res);
-
- return res->resolved;
-}
-
-static bool boot_option_resolve(struct discover_boot_option *opt,
- struct device_handler *handler)
-{
- return resource_resolve(opt->boot_image, opt->source, handler) &&
- resource_resolve(opt->initrd, opt->source, handler) &&
- resource_resolve(opt->icon, opt->source, handler);
-}
-
-static void boot_option_finalise(struct discover_boot_option *opt)
-{
- assert(boot_option_is_resolved(opt));
-
- /* check that the parsers haven't set any of the final data */
- assert(!opt->option->boot_image_file);
- assert(!opt->option->initrd_file);
- assert(!opt->option->icon_file);
-
- if (opt->boot_image)
- opt->option->boot_image_file = opt->boot_image->url->full;
- if (opt->initrd)
- opt->option->initrd_file = opt->initrd->url->full;
- if (opt->icon)
- opt->option->icon_file = opt->icon->url->full;
-}
-
-static void process_boot_option_queue(struct device_handler *handler)
-{
- struct discover_boot_option *opt, *tmp;
-
- list_for_each_entry_safe(&handler->unresolved_boot_options,
- opt, tmp, list) {
-
- if (!boot_option_resolve(opt, handler))
- continue;
-
- list_remove(&opt->list);
- list_add(&opt->device->boot_options, &opt->list);
- talloc_steal(opt->device, opt);
- boot_option_finalise(opt);
- discover_server_notify_boot_option_add(handler->server,
- opt->option);
- }
-}
-
-/**
- * context_commit - Commit a temporary discovery context to the handler,
- * and notify the clients about any new options / devices
- */
-static void context_commit(struct device_handler *handler,
- struct discover_context *ctx)
-{
- struct discover_device *dev = ctx->device;
- struct discover_boot_option *opt, *tmp;
- unsigned int i, existing_device = 0;
-
- /* do we already have this device? */
- for (i = 0; i < handler->n_devices; i++) {
- if (ctx->device == handler->devices[i]) {
- existing_device = 1;
- break;
- }
- }
-
- /* if not already present, add the device to the handler's array */
- if (!existing_device) {
- handler->n_devices++;
- handler->devices = talloc_realloc(handler, handler->devices,
- struct discover_device *, handler->n_devices);
- handler->devices[handler->n_devices - 1] = dev;
- talloc_steal(handler, dev);
-
- discover_server_notify_device_add(handler->server, dev->device);
-
- /* this new device might be able to resolve existing boot
- * options */
- process_boot_option_queue(handler);
- }