struct discover_boot_option *default_boot_option;
struct list unresolved_boot_options;
+
+ struct boot_task *pending_boot;
+ bool pending_boot_is_default;
};
static int mount_device(struct discover_device *dev);
if (!handler->default_boot_option)
return 0;
+ if (handler->pending_boot)
+ return 0;
+
opt = handler->default_boot_option;
if (handler->sec_to_boot) {
pb_log("Timeout expired, booting default option %s\n", opt->option->id);
- boot(handler, handler->default_boot_option, NULL,
- handler->dry_run, boot_status, handler);
+ handler->pending_boot = boot(handler, handler->default_boot_option,
+ NULL, handler->dry_run, boot_status, handler);
+ handler->pending_boot_is_default = true;
return 0;
}
ctx = talloc(handler, struct discover_context);
ctx->device = device;
ctx->conf_url = NULL;
+ ctx->test_data = NULL;
list_init(&ctx->boot_options);
return ctx;
struct discover_device *dev, enum conf_method method)
{
struct discover_context *ctx;
+ int rc;
process_boot_option_queue(handler);
/* create our context */
ctx = device_handler_discover_context_create(handler, dev);
- mount_device(dev);
+ rc = mount_device(dev);
+ if (rc)
+ goto out;
/* run the parsers. This will populate the ctx's boot_option list. */
iterate_parsers(ctx, method);
/* add discovered stuff to the handler */
device_handler_discover_context_commit(handler, ctx);
+out:
talloc_free(ctx);
return 0;
void device_handler_boot(struct device_handler *handler,
struct boot_command *cmd)
{
- struct discover_boot_option *opt;
+ struct discover_boot_option *opt = NULL;
- opt = find_boot_option_by_id(handler, cmd->option_id);
+ if (cmd->option_id && strlen(cmd->option_id))
+ opt = find_boot_option_by_id(handler, cmd->option_id);
- boot(handler, opt, cmd, handler->dry_run, boot_status, handler);
+ 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)
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;
continue;
if (mntstat.st_rdev == devstat.st_rdev) {
- pb_debug("%s: %s is already mounted at %s\n"
- __func__, dev->device_path,
- mnt->mnt_dir);
dev->mount_path = talloc_strdup(dev, mnt->mnt_dir);
+ dev->mounted_rw = !!hasmntopt(mnt, "rw");
dev->mounted = true;
dev->unmount = false;
+
+ pb_debug("%s: %s is already mounted (r%c) at %s\n",
+ __func__, dev->device_path,
+ dev->mounted_rw ? 'w' : 'o',
+ mnt->mnt_dir);
break;
}
}
"-o", "ro", NULL);
if (!rc) {
dev->mounted = true;
+ dev->mounted_rw = false;
dev->unmount = true;
return 0;
}
if (!rc) {
dev->mounted = true;
+ dev->mounted_rw = true;
dev->unmount = true;
return 0;
}
return -1;
dev->mounted = false;
+
+ pb_rmdir_recursive(mount_base(), dev->mount_path);
+
talloc_free(dev->mount_path);
dev->mount_path = NULL;
- pb_rmdir_recursive(mount_base(), dev->mount_path);
+ return 0;
+}
+
+int device_request_write(struct discover_device *dev, bool *release)
+{
+ int rc;
+ *release = false;
+
+ if (!dev->mounted)
+ return -1;
+
+ if (dev->mounted_rw)
+ return 0;
+
+ rc = process_run_simple(dev, pb_system_apps.mount, dev->mount_path,
+ "-o", "remount,rw", NULL);
+ if (rc)
+ return -1;
+
+ dev->mounted_rw = true;
+ *release = true;
return 0;
}
+
+void device_release_write(struct discover_device *dev, bool release)
+{
+ if (!release)
+ return;
+
+ process_run_simple(dev, pb_system_apps.mount, dev->mount_path,
+ "-o", "remount,ro", NULL);
+ dev->mounted_rw = false;
+}
+
#else
static int umount_device(struct discover_device *dev __attribute__((unused)))
return 0;
}
+int device_request_write(struct discover_device *dev __attribute__((unused)),
+ bool *release)
+{
+ *release = true;
+ return 0;
+}
+
+void device_release_write(struct discover_device *dev __attribute__((unused)),
+ bool release __attribute__((unused)))
+{
+}
+
#endif