Author: neel
Date: Mon Nov 12 22:38:54 2012
New Revision: 242935
URL: http://svnweb.freebsd.org/changeset/base/242935

Log:
  Add a callback function to userboot.so to fetch a list of environment
  variables and pass them to the kernel.
  
  Reviewed by:  dfr

Modified:
  head/sys/boot/userboot/test/test.c
  head/sys/boot/userboot/userboot.h
  head/sys/boot/userboot/userboot/main.c

Modified: head/sys/boot/userboot/test/test.c
==============================================================================
--- head/sys/boot/userboot/test/test.c  Mon Nov 12 22:28:32 2012        
(r242934)
+++ head/sys/boot/userboot/test/test.c  Mon Nov 12 22:38:54 2012        
(r242935)
@@ -364,6 +364,18 @@ test_getmem(void *arg, uint64_t *lowmem,
         *highmem = 0;
 }
 
+const char *
+test_getenv(void *arg, int idx)
+{
+       static const char *vars[] = {
+               "foo=bar",
+               "bar=barbar",
+               NULL
+       };
+
+       return (vars[idx]);
+}
+
 struct loader_callbacks cb = {
        .putc = test_putc,
        .getc = test_getc,
@@ -391,6 +403,8 @@ struct loader_callbacks cb = {
        .delay = test_delay,
        .exit = test_exit,
         .getmem = test_getmem,
+
+       .getenv = test_getenv,
 };
 
 void
@@ -450,5 +464,5 @@ main(int argc, char** argv)
        term.c_lflag &= ~(ICANON|ECHO);
        tcsetattr(0, TCSAFLUSH, &term);
 
-       func(&cb, NULL, USERBOOT_VERSION_2, disk_fd >= 0);
+       func(&cb, NULL, USERBOOT_VERSION_3, disk_fd >= 0);
 }

Modified: head/sys/boot/userboot/userboot.h
==============================================================================
--- head/sys/boot/userboot/userboot.h   Mon Nov 12 22:28:32 2012        
(r242934)
+++ head/sys/boot/userboot/userboot.h   Mon Nov 12 22:38:54 2012        
(r242935)
@@ -31,6 +31,7 @@
  */
 #define        USERBOOT_VERSION_1      1
 #define        USERBOOT_VERSION_2      2
+#define        USERBOOT_VERSION_3      3
 
 /*
  * Exit codes from the loader
@@ -176,9 +177,22 @@ struct loader_callbacks {
          */
        void            (*getmem)(void *arg, uint64_t *lowmem,
             uint64_t *highmem);
+
        /*
         * ioctl interface to the disk device
         */
        int             (*diskioctl)(void *arg, int unit, u_long cmd,
            void *data);
+
+       /*
+        * Returns an environment variable in the form "name=value".
+        *
+        * If there are no more variables that need to be set in the
+        * loader environment then return NULL.
+        *
+        * 'num' is used as a handle for the callback to identify which
+        * environment variable to return next. It will begin at 0 and
+        * each invocation will add 1 to the previous value of 'num'.
+        */
+       const char *    (*getenv)(void *arg, int num);
 };

Modified: head/sys/boot/userboot/userboot/main.c
==============================================================================
--- head/sys/boot/userboot/userboot/main.c      Mon Nov 12 22:28:32 2012        
(r242934)
+++ head/sys/boot/userboot/userboot/main.c      Mon Nov 12 22:38:54 2012        
(r242935)
@@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$");
 #include "disk.h"
 #include "libuserboot.h"
 
-#define        USERBOOT_VERSION        USERBOOT_VERSION_2
+#define        USERBOOT_VERSION        USERBOOT_VERSION_3
 
 struct loader_callbacks *callbacks;
 void *callbacks_arg;
@@ -70,6 +70,7 @@ void
 loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
 {
        static char malloc[512*1024];
+       const char *var;
        int i;
 
         if (version != USERBOOT_VERSION)
@@ -107,6 +108,17 @@ loader_main(struct loader_callbacks *cb,
 
        setenv("LINES", "24", 1);       /* optional */
 
+       /*
+        * Set custom environment variables
+        */
+       i = 0;
+       while (1) {
+               var = CALLBACK(getenv, i++);
+               if (var == NULL)
+                       break;
+               putenv(var);
+       }
+
        archsw.arch_autoload = userboot_autoload;
        archsw.arch_getdev = userboot_getdev;
        archsw.arch_copyin = userboot_copyin;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to