talloc_free(device);
}
-static void boot_status(void *arg, struct boot_status *status)
+void device_handler_boot_status(void *arg, struct boot_status *status)
{
struct device_handler *handler = arg;
pb_log("Timeout expired, booting default option %s\n", opt->option->id);
+ platform_pre_boot();
+
handler->pending_boot = boot(handler, handler->default_boot_option,
- NULL, handler->dry_run, boot_status, handler);
+ NULL, handler->dry_run, device_handler_boot_status,
+ handler);
handler->pending_boot_is_default = true;
return 0;
}
return ctx;
}
-/**
- * context_commit - Commit a temporary discovery context to the handler,
- * and notify the clients about any new options / devices
- */
-void device_handler_discover_context_commit(struct device_handler *handler,
- struct discover_context *ctx)
-{
- struct discover_device *dev = ctx->device;
- struct discover_boot_option *opt, *tmp;
-
- if (!device_lookup_by_id(handler, dev->device->id))
- device_handler_add_device(handler, dev);
-
- /* move boot options from the context to the device */
- list_for_each_entry_safe(&ctx->boot_options, opt, tmp, list) {
- list_remove(&opt->list);
-
- if (boot_option_resolve(opt, handler)) {
- pb_log("boot option %s is resolved, "
- "sending to clients\n",
- opt->option->id);
- list_add_tail(&dev->boot_options, &opt->list);
- talloc_steal(dev, opt);
- boot_option_finalise(handler, opt);
- notify_boot_option(handler, opt);
- } else {
- if (!opt->source->resolve_resource) {
- pb_log("parser %s gave us an unresolved "
- "resource (%s), but no way to "
- "resolve it\n",
- opt->source->name, opt->option->id);
- talloc_free(opt);
- } else {
- pb_log("boot option %s is unresolved, "
- "adding to queue\n",
- opt->option->id);
- list_add(&handler->unresolved_boot_options,
- &opt->list);
- talloc_steal(handler, opt);
- }
- }
- }
-}
-
void device_handler_add_device(struct device_handler *handler,
struct discover_device *device)
{
status->message = talloc_asprintf(status, _("Processing %s device %s"),
device_type_display_name(dev->device->type),
dev->device->id);
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
process_boot_option_queue(handler);
*/
status->message = talloc_asprintf(status,_("Processing %s complete"),
dev->device->id);
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
talloc_free(status);
- talloc_free(ctx);
+ talloc_unlink(handler, ctx);
return 0;
}
*/
status->message = talloc_asprintf(status, _("Processing dhcp event on %s"),
dev->device->id);
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
/* create our context */
ctx = device_handler_discover_context_create(handler, dev);
*/
status->message = talloc_asprintf(status,_("Processing %s complete"),
dev->device->id);
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
talloc_free(status);
- talloc_free(ctx);
+ talloc_unlink(handler, ctx);
return 0;
}
status = talloc_zero(handler, struct boot_status);
status->type = BOOT_STATUS_INFO;
status->message = talloc_asprintf(status, _("Processing user config"));
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
/* create our context */
ctx = device_handler_discover_context_create(handler, dev);
status->message = talloc_asprintf(status,
_("Processing user config complete"));
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
talloc_free(status);
- talloc_free(ctx);
+ talloc_unlink(handler, ctx);
return 0;
}
platform_pre_boot();
handler->pending_boot = boot(handler, opt, cmd, handler->dry_run,
- boot_status, handler);
+ device_handler_boot_status, handler);
handler->pending_boot_is_default = false;
}
}
pb_url = pb_url_parse(event, event->params->value);
- if (!pb_url || !pb_url->host) {
+ if (!pb_url || (pb_url->scheme != pb_url_file && !pb_url->host)) {
status->message = talloc_asprintf(handler,
_("Invalid config URL!"));
goto msg;
}
- event->device = device_from_addr(event, pb_url);
+ if (pb_url->scheme == pb_url_file)
+ event->device = talloc_asprintf(event, "local");
+ else
+ event->device = device_from_addr(event, pb_url);
+
if (!event->device) {
status->message = talloc_asprintf(status,
_("Unable to route to host %s"),
}
dev = discover_device_create(handler, event->device);
+ if (pb_url->scheme == pb_url_file)
+ dev->device->type = DEVICE_TYPE_ANY;
ctx = device_handler_discover_context_create(handler, dev);
ctx->event = event;
device_handler_discover_context_commit(handler, ctx);
- talloc_free(ctx);
+ talloc_unlink(handler, ctx);
status->type = BOOT_STATUS_INFO;
status->message = talloc_asprintf(status, _("Config file %s parsed"),
pb_url->file);
msg:
- boot_status(handler, status);
+ device_handler_boot_status(handler, status);
talloc_free(status);
}
#ifndef PETITBOOT_TEST
+/**
+ * context_commit - Commit a temporary discovery context to the handler,
+ * and notify the clients about any new options / devices
+ */
+void device_handler_discover_context_commit(struct device_handler *handler,
+ struct discover_context *ctx)
+{
+ struct discover_device *dev = ctx->device;
+ struct discover_boot_option *opt, *tmp;
+
+ if (!device_lookup_by_id(handler, dev->device->id))
+ device_handler_add_device(handler, dev);
+
+ /* move boot options from the context to the device */
+ list_for_each_entry_safe(&ctx->boot_options, opt, tmp, list) {
+ list_remove(&opt->list);
+
+ /* All boot options need at least a kernel image */
+ if (!opt->boot_image || !opt->boot_image->url) {
+ pb_log("boot option %s is missing boot image, ignoring\n",
+ opt->option->id);
+ talloc_free(opt);
+ continue;
+ }
+
+ if (boot_option_resolve(opt, handler)) {
+ pb_log("boot option %s is resolved, "
+ "sending to clients\n",
+ opt->option->id);
+ list_add_tail(&dev->boot_options, &opt->list);
+ talloc_steal(dev, opt);
+ boot_option_finalise(handler, opt);
+ notify_boot_option(handler, opt);
+ } else {
+ if (!opt->source->resolve_resource) {
+ pb_log("parser %s gave us an unresolved "
+ "resource (%s), but no way to "
+ "resolve it\n",
+ opt->source->name, opt->option->id);
+ talloc_free(opt);
+ } else {
+ pb_log("boot option %s is unresolved, "
+ "adding to queue\n",
+ opt->option->id);
+ list_add(&handler->unresolved_boot_options,
+ &opt->list);
+ talloc_steal(handler, opt);
+ }
+ }
+ }
+}
+
static void device_handler_update_lang(const char *lang)
{
const char *cur_lang;
#else
+void device_handler_discover_context_commit(
+ struct device_handler *handler __attribute__((unused)),
+ struct discover_context *ctx __attribute__((unused)))
+{
+ pb_log("%s stubbed out for test cases\n", __func__);
+}
+
static void device_handler_update_lang(const char *lang __attribute__((unused)))
{
}
}
#endif
-