]> git.ozlabs.org Git - petitboot/blobdiff - discover/boot.c
discover/boot: Set boot_tty variable before kexec
[petitboot] / discover / boot.c
index 7778b3fd02bc21f588e260e08cb888d20b4a266a..ba6ce25928180cf02847e1bcfe5fda4a8d4636e4 100644 (file)
@@ -24,6 +24,7 @@
 #include "boot.h"
 #include "paths.h"
 #include "resource.h"
+#include "platform.h"
 
 static const char *boot_hook_dir = PKG_SYSCONF_DIR "/boot.d";
 enum {
@@ -39,6 +40,7 @@ struct boot_task {
        const char *local_initrd;
        const char *local_dtb;
        const char *args;
+       const char *boot_tty;
        boot_status_fn status_fn;
        void *status_arg;
        bool dry_run;
@@ -206,6 +208,7 @@ static void boot_hook_setenv(struct boot_task *task)
        unsetenv("boot_initrd");
        unsetenv("boot_dtb");
        unsetenv("boot_args");
+       unsetenv("boot_tty");
 
        setenv("boot_image", task->local_image, 1);
        if (task->local_initrd)
@@ -214,6 +217,8 @@ static void boot_hook_setenv(struct boot_task *task)
                setenv("boot_dtb", task->local_dtb, 1);
        if (task->args)
                setenv("boot_args", task->args, 1);
+       if (task->boot_tty)
+               setenv("boot_tty", task->boot_tty, 1);
 }
 
 static int hook_filter(const struct dirent *dirent)
@@ -430,6 +435,7 @@ struct boot_task *boot(void *ctx, struct discover_boot_option *opt,
                boot_status_fn status_fn, void *status_arg)
 {
        struct pb_url *image = NULL, *initrd = NULL, *dtb = NULL;
+       const struct config *config;
        struct boot_task *boot_task;
        const char *boot_desc;
        int rc;
@@ -481,14 +487,22 @@ struct boot_task *boot(void *ctx, struct discover_boot_option *opt,
                boot_task->args = NULL;
        }
 
+       if (cmd && cmd->tty)
+               boot_task->boot_tty = talloc_strdup(boot_task, cmd->tty);
+       else {
+               config = config_get();
+               boot_task->boot_tty = config ? config->boot_tty : NULL;
+       }
+
        /* start async loads for boot resources */
        rc = start_url_load(boot_task, "kernel image", image, &boot_task->image)
          || start_url_load(boot_task, "initrd", initrd, &boot_task->initrd)
          || start_url_load(boot_task, "dtb", dtb, &boot_task->dtb);
 
-       /* If all URLs are local, we may be done. */
        if (rc) {
-               talloc_free(boot_task);
+               /* Don't call boot_cancel() to preserve the status update */
+               boot_task->cancelled = true;
+               cleanup_cancellations(boot_task, NULL);
                return NULL;
        }