From: Jeremy Kerr Date: Wed, 1 May 2013 01:56:54 +0000 (+0800) Subject: discover: Send boot status messages during boot() X-Git-Tag: v1.0.0~670 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=375c81a1b9aa8904dfdd0b1195fe99a1e4a2fa9d discover: Send boot status messages during boot() Now what we have protocol support, send status updates during the boot process. Signed-off-by: Jeremy Kerr --- diff --git a/discover/boot.c b/discover/boot.c index 804425c..d054d5d 100644 --- a/discover/boot.c +++ b/discover/boot.c @@ -97,8 +97,21 @@ static int kexec_reboot(int dry_run) return result; } +static void update_status(boot_status_fn fn, void *arg, int type, + char *message) +{ + struct boot_status status; + + status.type = type; + status.message = message; + status.progress = -1; + status.detail = NULL; + + fn(arg, &status); +} + int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd, - int dry_run) + int dry_run, boot_status_fn status_fn, void *status_arg) { char *local_image, *local_initrd; unsigned int clean_image = 0; @@ -135,18 +148,36 @@ int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd, result = -1; + update_status(status_fn, status_arg, BOOT_STATUS_INFO, + "loading kernel"); local_image = load_url(NULL, image, &clean_image); - if (!local_image) + if (!local_image) { + update_status(status_fn, status_arg, BOOT_STATUS_ERROR, + "Couldn't load kernel image"); goto no_load; + } if (initrd) { + update_status(status_fn, status_arg, BOOT_STATUS_INFO, + "loading initrd"); local_initrd = load_url(NULL, initrd, &clean_initrd); - if (!local_initrd) + if (!local_initrd) { + update_status(status_fn, status_arg, BOOT_STATUS_ERROR, + "Couldn't load initrd image"); goto no_load; + } } + update_status(status_fn, status_arg, BOOT_STATUS_INFO, + "performing kexec_load"); + result = kexec_load(local_image, local_initrd, args, dry_run); + if (result) { + update_status(status_fn, status_arg, BOOT_STATUS_ERROR, + "kexec load failed"); + } + no_load: if (clean_image) unlink(local_image); @@ -156,8 +187,17 @@ no_load: talloc_free(local_image); talloc_free(local_initrd); - if (!result) + if (!result) { + update_status(status_fn, status_arg, BOOT_STATUS_INFO, + "performing kexec reboot"); + result = kexec_reboot(dry_run); + if (result) { + update_status(status_fn, status_arg, BOOT_STATUS_ERROR, + "kexec reboot failed"); + } + } + return result; } diff --git a/discover/boot.h b/discover/boot.h index 1dc5767..bbb02cf 100644 --- a/discover/boot.h +++ b/discover/boot.h @@ -4,7 +4,9 @@ struct boot_option; struct boot_command; +typedef void (*boot_status_fn)(void *arg, struct boot_status *); + int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd, - int dry_run); + int dry_run, boot_status_fn status_fn, void *status_arg); #endif /* _BOOT_H */ diff --git a/discover/device-handler.c b/discover/device-handler.c index 594a7c3..d3274bc 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -663,6 +663,13 @@ static struct discover_boot_option *find_boot_option_by_id( return NULL; } +static void boot_status(void *arg, struct boot_status *status) +{ + struct device_handler *handler = arg; + + discover_server_notify_boot_status(handler->server, status); +} + void device_handler_boot(struct device_handler *handler, struct boot_command *cmd) { @@ -670,5 +677,5 @@ void device_handler_boot(struct device_handler *handler, opt = find_boot_option_by_id(handler, cmd->option_id); - boot(handler, opt, cmd, handler->dry_run); + boot(handler, opt, cmd, handler->dry_run, boot_status, handler); }