blob: cdc49b94f04fd350bac643ddd8b97a8f59ace56b [file] [log] [blame]
/*
* Copyright (c) 2020 The Fuchsia Authors
*/
#include <common.h>
#include <stdlib.h>
#include <zircon_uboot/boot_args.h>
#include <zircon_uboot/zircon.h>
static char *args = NULL;
static uint32_t args_len = 0;
// Chosen arbitrarily to make overflow checking easier so that we won't "wrap
// around" a uint32_t more than once. Can increase if needed.
#define MAX_ARG_LEN 2048
int zircon_store_cmdline(const char *payload)
{
if (!payload) {
return -1;
}
size_t length = strlen(payload);
if (length == 0) {
return -1;
}
if (length > MAX_ARG_LEN) {
printf("Error: arg is too big\n");
return -1;
}
uint32_t new_args_len;
if (args) {
// a ' ' is inserted after previous args
new_args_len = args_len + length + 1;
} else {
new_args_len = length;
}
// Make sure new_args_len didn't overflow.
if (new_args_len < args_len) {
printf("Error: can't fit this arg\n");
return -1;
}
char *new_args = malloc((size_t)new_args_len + 1);
if (!new_args) {
return -1;
}
new_args[new_args_len] = '\0';
if (args) {
memcpy(new_args, args, args_len);
free(args);
new_args[args_len] = ' ';
memcpy(new_args + args_len + 1, payload, length);
} else {
memcpy(new_args, payload, length);
}
args_len = new_args_len;
args = new_args;
printf("args: %s, args_len: %u\n", args, args_len);
return 0;
}
int zircon_clear_stored_cmdline(void)
{
if (args) {
free(args);
args = NULL;
}
args_len = 0;
return 0;
}
int zircon_append_cmdline(zbi_header_t *zbi, size_t capacity)
{
int ret = 0;
if (args) {
ret = append_zbi_item_or_log(zbi, capacity, ZBI_TYPE_CMDLINE, 0,
args, args_len + 1);
free(args);
args = NULL;
args_len = 0;
}
return ret;
}