svn commit: r242935 - in head/sys/boot/userboot: . test userboot
Neel Natu
neel at FreeBSD.org
Mon Nov 12 22:38:54 UTC 2012
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;
More information about the svn-src-head
mailing list