struct autoboot_option *temp_autoboot;
struct discover_boot_option *default_boot_option;
+ struct discover_boot_option *last_boot_option;
int default_boot_option_priority;
struct list unresolved_boot_options;
void device_handler_status(struct device_handler *handler,
struct status *status)
{
+ pb_debug("%s: %s\n", __func__, status->message);
discover_server_notify_boot_status(handler->server, status);
}
status.type = type;
status.message = talloc_vasprintf(handler, fmt, ap);
status.backlog = false;
+ status.boot_active = false;
device_handler_status(handler, &status);
}
if (!update) {
- pb_log("%s: failed to allocate new status\n", __func__);
+ pb_log_fn("failed to allocate new status\n");
} else {
device_handler_status_info(handler, "%s\n", update);
talloc_free(update);
opt = handler->default_boot_option;
+ handler->last_boot_option = opt;
+
if (handler->sec_to_boot) {
countdown_status(handler, opt, handler->sec_to_boot);
handler->sec_to_boot--;
return;
}
+ if (handler->default_boot_option)
+ handler->default_boot_option->option->is_autoboot_default = false;
+ opt->option->is_autoboot_default = true;
+
handler->sec_to_boot = config_get()->autoboot_timeout_sec;
handler->default_boot_option = opt;
handler->default_boot_option_priority = new_prio;
struct requery_data *rqd = data;
struct device_handler *handler;
struct discover_device *device;
+ bool autoboot;
handler = rqd->handler;
device = rqd->device;
talloc_free(opt);
}
+ /* Track whether autoboot was enabled, if we cancel a default option
+ * it will be switched off.
+ */
+ autoboot = handler->autoboot_enabled;
+
list_for_each_entry_safe(&device->boot_options, opt, tmp, list) {
if (opt == handler->default_boot_option) {
- pb_log("Default option %s cancelled since device is being requeried",
+ pb_log("Default option %s cancelled since device is being requeried\n",
opt->option->name);
device_handler_cancel_default(handler);
}
talloc_free(opt);
}
+ handler->autoboot_enabled = autoboot;
+
discover_server_notify_device_remove(handler->server, device->device);
device->notified = false;
return 0;
}
+struct discover_boot_option *device_handler_find_option_by_name(
+ struct device_handler *handler, const char *device,
+ const char *name)
+{
+ size_t len = strlen(name);
+ 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)
+ /* Match exactly, partial matches can be quite common */
+ if (strlen(opt->option->name) == len &&
+ !strcmp(opt->option->name, name))
+ if (!dev || !strcmp(opt->option->device_id, device))
+ return opt;
+ }
+
+ return NULL;
+}
+
static struct discover_boot_option *find_boot_option_by_id(
struct device_handler *handler, const char *id)
{
}
void device_handler_boot(struct device_handler *handler,
- struct boot_command *cmd)
+ bool change_default, 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);
+ /* Don't allow a normal client to change the default */
+ if (!change_default && handler->last_boot_option &&
+ opt != handler->last_boot_option) {
+ pb_log("Non-root user tried to change boot option\n");
+ device_handler_status_err(handler,
+ "Must be root to change default boot option\n");
+ return;
+ }
+
if (handler->pending_boot)
boot_cancel(handler->pending_boot);
int rc;
rc = config_set(config);
- if (rc)
+ if (rc) {
+ device_handler_status_err(handler,
+ "Failed to update configuration!");
return;
+ }
discover_server_notify_config(handler->server, config);
device_handler_update_lang(config->lang);
const char *mac;
if (result->status != LOAD_OK) {
- pb_log("%s: Load failed for %s\n", __func__, result->url->full);
+ pb_log_fn("Load failed for %s\n", result->url->full);
return;
}
struct device_handler *handler = process->data;
if (!handler) {
- pb_log("%s: Missing data!\n", __func__);
+ pb_log_fn("Missing data!\n");
return;
}
struct device_handler *handler __attribute__((unused)),
struct discover_context *ctx __attribute__((unused)))
{
- pb_log("%s stubbed out for test cases\n", __func__);
+ pb_log_fn("stubbed out for test cases\n");
}
static void device_handler_update_lang(const char *lang __attribute__((unused)))