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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to