Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Dec 2015 03:07:38 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292584 - head/sys/boot/efi/loader
Message-ID:  <201512220307.tBM37cJU011829@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Tue Dec 22 03:07:38 2015
New Revision: 292584
URL: https://svnweb.freebsd.org/changeset/base/292584

Log:
  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

Modified:
  head/sys/boot/efi/loader/main.c

Modified: head/sys/boot/efi/loader/main.c
==============================================================================
--- head/sys/boot/efi/loader/main.c	Tue Dec 22 03:02:52 2015	(r292583)
+++ head/sys/boot/efi/loader/main.c	Tue Dec 22 03:07:38 2015	(r292584)
@@ -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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201512220307.tBM37cJU011829>