+ unsigned int i;
+
+ for (i = 0; i < handler->n_devices; i++) {
+ struct discover_device *dev = handler->devices[i];
+ struct discover_boot_option *opt;
+
+ list_for_each_entry(&dev->boot_options, opt, list)
+ if (!strcmp(opt->option->id, id))
+ return opt;
+ }
+
+ return NULL;
+}
+
+void device_handler_boot(struct device_handler *handler,
+ struct boot_command *cmd)
+{
+ struct discover_boot_option *opt = NULL;
+
+ if (cmd->option_id && strlen(cmd->option_id))
+ opt = find_boot_option_by_id(handler, cmd->option_id);
+
+ if (handler->pending_boot)
+ boot_cancel(handler->pending_boot);
+ handler->pending_boot = boot(handler, opt, cmd, handler->dry_run,
+ boot_status, handler);
+ handler->pending_boot_is_default = false;
+}
+
+void device_handler_cancel_default(struct device_handler *handler)
+{
+ struct boot_status status;
+
+ if (handler->timeout_waiter)
+ waiter_remove(handler->timeout_waiter);
+
+ handler->timeout_waiter = NULL;
+ handler->autoboot_enabled = false;
+
+ /* we only send status if we had a default boot option queued */
+ if (!handler->default_boot_option)
+ return;
+
+ pb_log("Cancelling default boot option\n");
+
+ if (handler->pending_boot && handler->pending_boot_is_default) {
+ boot_cancel(handler->pending_boot);
+ handler->pending_boot = NULL;
+ handler->pending_boot_is_default = false;
+ }
+
+ handler->default_boot_option = NULL;
+
+ status.type = BOOT_STATUS_INFO;
+ status.progress = -1;
+ status.detail = NULL;
+ status.message = "Default boot cancelled";
+
+ discover_server_notify_boot_status(handler->server, &status);
+}
+
+void device_handler_update_config(struct device_handler *handler,
+ struct config *config)
+{
+ config_set(config);
+ discover_server_notify_config(handler->server, config);
+}
+
+#ifndef PETITBOOT_TEST
+static bool check_existing_mount(struct discover_device *dev)
+{
+ struct stat devstat, mntstat;
+ struct mntent *mnt;
+ FILE *fp;