From 01f60e05ef83e3b91f7084ed95e6cc07412c8bb9 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 21 May 2013 13:33:46 +0800 Subject: [PATCH] discover: implement default booting When we see a boot option with is_default set, store it in the handler and register a timeout waiter. Signed-off-by: Jeremy Kerr --- discover/device-handler.c | 57 +++++++++++++++++++++++++++++++-------- discover/device-handler.h | 5 +++- discover/pb-discover.c | 2 +- test/parser/utils.c | 2 +- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/discover/device-handler.c b/discover/device-handler.c index 9b2ef3d..f1632f0 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -30,6 +30,10 @@ struct device_handler { struct discover_device **devices; unsigned int n_devices; + struct waitset *waitset; + struct waiter *timeout_waiter; + + struct discover_boot_option *default_boot_option; struct list unresolved_boot_options; }; @@ -176,6 +180,7 @@ void device_handler_destroy(struct device_handler *handler) * to keep struct device_handler opaque. */ struct device_handler *device_handler_init( struct discover_server *server __attribute__((unused)), + struct waitset *waitset __attribute__((unused)), int dry_run __attribute__((unused))) { struct device_handler *handler; @@ -274,7 +279,7 @@ static int umount_device(struct discover_device *dev) } struct device_handler *device_handler_init(struct discover_server *server, - int dry_run) + struct waitset *waitset, int dry_run) { struct device_handler *handler; @@ -282,7 +287,9 @@ struct device_handler *device_handler_init(struct discover_server *server, handler->devices = NULL; handler->n_devices = 0; handler->server = server; + handler->waitset = waitset; handler->dry_run = dry_run; + handler->default_boot_option = NULL; list_init(&handler->unresolved_boot_options); /* set up our mount point base */ @@ -373,6 +380,37 @@ static void device_handler_remove(struct device_handler *handler, talloc_free(device); } +static void boot_status(void *arg, struct boot_status *status) +{ + struct device_handler *handler = arg; + + discover_server_notify_boot_status(handler->server, status); +} + +static int default_timeout(void *arg) +{ + struct device_handler *handler = arg; + + if (!handler->default_boot_option) + return 0; + + boot(handler, handler->default_boot_option, NULL, + handler->dry_run, boot_status, handler); + return 0; +} + +static void set_default(struct device_handler *handler, + struct discover_boot_option *opt) +{ + if (handler->default_boot_option) + return; + + handler->default_boot_option = opt; + handler->timeout_waiter = waiter_register_timeout(handler->waitset, + DEFAULT_BOOT_TIMEOUT_SEC * 1000, + default_timeout, handler); +} + static bool resource_is_resolved(struct resource *res) { return !res || res->resolved; @@ -412,7 +450,8 @@ static bool boot_option_resolve(struct discover_boot_option *opt, resource_resolve(opt->icon, "icon", opt, handler); } -static void boot_option_finalise(struct discover_boot_option *opt) +static void boot_option_finalise(struct device_handler *handler, + struct discover_boot_option *opt) { assert(boot_option_is_resolved(opt)); @@ -430,6 +469,9 @@ static void boot_option_finalise(struct discover_boot_option *opt) opt->option->icon_file = opt->icon->url->full; opt->option->device_id = opt->device->device->id; + + if (opt->option->is_default) + set_default(handler, opt); } static void process_boot_option_queue(struct device_handler *handler) @@ -450,7 +492,7 @@ static void process_boot_option_queue(struct device_handler *handler) list_remove(&opt->list); list_add_tail(&opt->device->boot_options, &opt->list); talloc_steal(opt->device, opt); - boot_option_finalise(opt); + boot_option_finalise(handler, opt); discover_server_notify_boot_option_add(handler->server, opt->option); } @@ -502,7 +544,7 @@ static void context_commit(struct device_handler *handler, opt->option->id); list_add_tail(&dev->boot_options, &opt->list); talloc_steal(dev, opt); - boot_option_finalise(opt); + boot_option_finalise(handler, opt); discover_server_notify_boot_option_add(handler->server, opt->option); } else { @@ -704,13 +746,6 @@ int device_handler_event(struct device_handler *handler, return handlers[event->type][event->action](handler, event); } -static void boot_status(void *arg, struct boot_status *status) -{ - struct device_handler *handler = arg; - - discover_server_notify_boot_status(handler->server, status); -} - static struct discover_boot_option *find_boot_option_by_id( struct device_handler *handler, const char *id) { diff --git a/discover/device-handler.h b/discover/device-handler.h index f4c911e..7182f00 100644 --- a/discover/device-handler.h +++ b/discover/device-handler.h @@ -3,6 +3,8 @@ #include +#define DEFAULT_BOOT_TIMEOUT_SEC 10 + struct device_handler; struct discover_device; struct discover_server; @@ -10,6 +12,7 @@ struct boot_option; struct boot_command; struct event; struct device; +struct waitset; enum conf_method { CONF_METHOD_LOCAL_FILE, /* discover by looking at local files on this @@ -57,7 +60,7 @@ struct discover_context { }; struct device_handler *device_handler_init(struct discover_server *server, - int dry_run); + struct waitset *waitset, int dry_run); void device_handler_destroy(struct device_handler *devices); diff --git a/discover/pb-discover.c b/discover/pb-discover.c index 9330da6..6966ba4 100644 --- a/discover/pb-discover.c +++ b/discover/pb-discover.c @@ -151,7 +151,7 @@ int main(int argc, char *argv[]) if (!server) return EXIT_FAILURE; - handler = device_handler_init(server, opts.dry_run == opt_yes); + handler = device_handler_init(server, waitset, opts.dry_run == opt_yes); if (!handler) return EXIT_FAILURE; diff --git a/test/parser/utils.c b/test/parser/utils.c index 6f78c2f..70a40bb 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -86,7 +86,7 @@ struct parser_test *test_init(void) struct parser_test *test; test = talloc_zero(NULL, struct parser_test); - test->handler = device_handler_init(NULL, 0); + test->handler = device_handler_init(NULL, NULL, 0); test->ctx = test_create_context(test); return test; -- 2.39.2