diff options
author | ian <ian@FreeBSD.org> | 2015-12-22 03:07:38 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2015-12-22 03:07:38 +0000 |
commit | 60471ce30ea4b3f7cad7cb2a6ffff575429750e0 (patch) | |
tree | c989d49610d1118ca5aeaef45d50e6494bd9e3a8 /sys | |
parent | 8bcbd2f7a15b35e2593c98e734d54def6dfbc95c (diff) | |
download | FreeBSD-src-60471ce30ea4b3f7cad7cb2a6ffff575429750e0.zip FreeBSD-src-60471ce30ea4b3f7cad7cb2a6ffff575429750e0.tar.gz |
Set env vars from values on the efi loader command line.
Examine each cmdline arg and if it contains an '=' convert it to ascii and
pass it to putenv(). This allows var=value settings to come in on the
command line.
This will allow overriding dhcp server-provided data in loader(8), as
discussed in PR 202098
PR: 202098
Differential Revision: https://reviews.freebsd.org/D4561
Diffstat (limited to 'sys')
-rw-r--r-- | sys/boot/efi/loader/main.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c index 8044db5..fc8949e 100644 --- a/sys/boot/efi/loader/main.c +++ b/sys/boot/efi/loader/main.c @@ -64,10 +64,10 @@ EFI_GUID fdtdtb = FDT_TABLE_GUID; EFI_STATUS main(int argc, CHAR16 *argv[]) { - char vendor[128]; + char var[128]; EFI_LOADED_IMAGE *img; EFI_GUID *guid; - int i; + int i, j, vargood; /* * XXX Chicken-and-egg problem; we want to have console output @@ -77,6 +77,29 @@ main(int argc, CHAR16 *argv[]) */ cons_probe(); + /* + * Loop through the args, and for each one that contains an '=' that is + * not the first character, add it to the environment. This allows + * loader and kernel env vars to be passed on the command line. Convert + * args from UCS-2 to ASCII (16 to 8 bit) as they are copied. + */ + for (i = 1; i < argc; i++) { + vargood = 0; + for (j = 0; argv[i][j] != 0; j++) { + if (j == sizeof(var)) { + vargood = 0; + break; + } + if (j > 0 && argv[i][j] == '=') + vargood = 1; + var[j] = (char)argv[i][j]; + } + if (vargood) { + var[j] = 0; + putenv(var); + } + } + if (efi_copy_init()) { printf("failed to allocate staging area\n"); return (EFI_BUFFER_TOO_SMALL); |