X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=dd3aee92ca35d0385880b190f60a379494152ad8;hp=352a477d16230c49b4a14c6201bf3d7ab03de649;hb=37bff93c8b0a71432613f41f2319dc073ca64619;hpb=edcfca78ac49793e295ac97328942321f39e3996 diff --git a/discover/device-handler.c b/discover/device-handler.c index 352a477..dd3aee9 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -57,6 +57,7 @@ static int mount_device(struct discover_device *dev); static int umount_device(struct discover_device *dev); static int device_handler_init_sources(struct device_handler *handler); +static void device_handler_reinit_sources(struct device_handler *handler); void discover_context_add_boot_option(struct discover_context *ctx, struct discover_boot_option *boot_option) @@ -293,6 +294,31 @@ struct device_handler *device_handler_init(struct discover_server *server, return handler; } +void device_handler_reinit(struct device_handler *handler) +{ + struct discover_boot_option *opt, *tmp; + unsigned int i; + + device_handler_cancel_default(handler); + + /* free unresolved boot options */ + list_for_each_entry_safe(&handler->unresolved_boot_options, + opt, tmp, list) + talloc_free(opt); + list_init(&handler->unresolved_boot_options); + + /* drop all devices */ + for (i = 0; i < handler->n_devices; i++) + discover_server_notify_device_remove(handler->server, + handler->devices[i]->device); + + talloc_free(handler->devices); + handler->devices = NULL; + handler->n_devices = 0; + + device_handler_reinit_sources(handler); +} + void device_handler_remove(struct device_handler *handler, struct discover_device *device) { @@ -763,6 +789,7 @@ void device_handler_update_config(struct device_handler *handler, { config_set(config); discover_server_notify_config(handler->server, config); + device_handler_reinit(handler); } #ifndef PETITBOOT_TEST @@ -786,6 +813,15 @@ static int device_handler_init_sources(struct device_handler *handler) return 0; } +static void device_handler_reinit_sources(struct device_handler *handler) +{ + udev_reinit(handler->udev); + + network_shutdown(handler->network); + handler->network = network_init(handler, handler->waitset, + handler->dry_run); +} + static bool check_existing_mount(struct discover_device *dev) { struct stat devstat, mntstat; @@ -953,6 +989,11 @@ static int device_handler_init_sources( return 0; } +static void device_handler_reinit_sources( + struct device_handler *handler __attribute__((unused))) +{ +} + static int umount_device(struct discover_device *dev __attribute__((unused))) { return 0;