#include <talloc/talloc.h>
#include <url/url.h>
#include <util/util.h>
+#include <i18n/i18n.h>
#include "device-handler.h"
#include "boot.h"
#include "paths.h"
#include "resource.h"
+#include "platform.h"
static const char *boot_hook_dir = PKG_SYSCONF_DIR "/boot.d";
enum {
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;
*p++ = s_dtb; /* 4 */
}
- if (boot_task->args) {
- s_args = talloc_asprintf(boot_task, "--append=%s",
- boot_task->args);
- assert(s_args);
- *p++ = s_args; /* 5 */
- }
+ s_args = talloc_asprintf(boot_task, "--append=%s",
+ boot_task->args ?: "\"\"");
+ assert(s_args);
+ *p++ = s_args; /* 5 */
*p++ = boot_task->local_image; /* 6 */
*p++ = NULL; /* 7 */
char *buf)
{
char *line, *name, *val, *sep;
- char *saveptr;
+ char *saveptr = NULL;
for (;; buf = NULL) {
unsetenv("boot_initrd");
unsetenv("boot_dtb");
unsetenv("boot_args");
+ unsetenv("boot_tty");
setenv("boot_image", task->local_image, 1);
if (task->local_initrd)
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)
return;
update_status(task->status_fn, task->status_arg, BOOT_STATUS_INFO,
- "running boot hooks");
+ _("running boot hooks"));
boot_hook_setenv(task);
update_status(task->status_fn, task->status_arg,
BOOT_STATUS_ERROR,
- "Couldn't load %s", name);
+ _("Couldn't load %s"), name);
return -1;
}
} else if (result->status == LOAD_ASYNC) {
load_url_async_cancel(result);
pending = true;
+
+ /* if we're waiting for a cancellation, we still need to
+ * wait for the completion before freeing the boot task */
+ } else if (result->status == LOAD_CANCELLED) {
+ pending = true;
}
}
run_boot_hooks(task);
update_status(task->status_fn, task->status_arg, BOOT_STATUS_INFO,
- "performing kexec_load");
+ _("performing kexec_load"));
rc = kexec_load(task);
if (rc) {
update_status(task->status_fn, task->status_arg,
- BOOT_STATUS_ERROR, "kexec load failed");
+ BOOT_STATUS_ERROR, _("kexec load failed"));
}
no_load:
if (!rc) {
update_status(task->status_fn, task->status_arg,
BOOT_STATUS_INFO,
- "performing kexec reboot");
+ _("performing kexec reboot"));
rc = kexec_reboot(task);
if (rc) {
update_status(task->status_fn, task->status_arg,
BOOT_STATUS_ERROR,
- "kexec reboot failed");
+ _("kexec reboot failed"));
}
}
}
if (!*result) {
update_status(task->status_fn, task->status_arg,
BOOT_STATUS_ERROR,
- "Error loading %s", name);
+ _("Error loading %s"), name);
return -1;
}
return 0;
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;
else if (cmd && cmd->boot_image_file)
boot_desc = cmd->boot_image_file;
else
- boot_desc = "(unknown)";
+ boot_desc = _("(unknown)");
update_status(status_fn, status_arg, BOOT_STATUS_INFO,
- "Booting %s.", boot_desc);
+ _("Booting %s."), boot_desc);
if (cmd && cmd->boot_image_file) {
image = pb_url_parse(opt, cmd->boot_image_file);
} else {
pb_log("%s: no image specified\n", __func__);
update_status(status_fn, status_arg, BOOT_STATUS_INFO,
- "Boot failed: no image specified");
+ _("Boot failed: no image specified"));
return NULL;
}
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;
}
task->cancelled = true;
update_status(task->status_fn, task->status_arg, BOOT_STATUS_INFO,
- "Boot cancelled");
+ _("Boot cancelled"));
cleanup_cancellations(task, NULL);
}