Add a callback function to userboot.so to fetch a list of environment
variables and pass them to the kernel. Bump up the userboot version to USERBOOT_VERSION_3. This takes into account the bump to USERBOOT_VERSION_2 that has already happened in head (but not propagated to this branch yet). Reviewed by: dfr@ Obtained from: NetApp
This commit is contained in:
parent
091578815a
commit
9aedd7f40e
@ -339,6 +339,18 @@ test_getmem(void *arg, uint64_t *lowmem, uint64_t *highmem)
|
||||
*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_v1 cb = {
|
||||
.putc = test_putc,
|
||||
.getc = test_getc,
|
||||
@ -365,6 +377,8 @@ struct loader_callbacks_v1 cb = {
|
||||
.delay = test_delay,
|
||||
.exit = test_exit,
|
||||
.getmem = test_getmem,
|
||||
|
||||
.getenv = test_getenv,
|
||||
};
|
||||
|
||||
void
|
||||
@ -424,5 +438,5 @@ main(int argc, char** argv)
|
||||
term.c_lflag &= ~(ICANON|ECHO);
|
||||
tcsetattr(0, TCSAFLUSH, &term);
|
||||
|
||||
func(&cb, NULL, USERBOOT_VERSION_1, disk_fd >= 0);
|
||||
func(&cb, NULL, USERBOOT_VERSION_3, disk_fd >= 0);
|
||||
}
|
||||
|
@ -29,7 +29,7 @@
|
||||
/*
|
||||
* USERBOOT interface versions
|
||||
*/
|
||||
#define USERBOOT_VERSION_1 1
|
||||
#define USERBOOT_VERSION_3 3
|
||||
|
||||
/*
|
||||
* Exit codes from the loader
|
||||
@ -175,4 +175,16 @@ struct loader_callbacks_v1 {
|
||||
*/
|
||||
void (*getmem)(void *arg, uint64_t *lowmem,
|
||||
uint64_t *highmem);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
};
|
||||
|
@ -68,9 +68,10 @@ void
|
||||
loader_main(struct loader_callbacks_v1 *cb, void *arg, int version, int ndisks)
|
||||
{
|
||||
static char malloc[1024*1024];
|
||||
const char *var;
|
||||
int i;
|
||||
|
||||
if (version != USERBOOT_VERSION_1)
|
||||
if (version != USERBOOT_VERSION_3)
|
||||
abort();
|
||||
|
||||
callbacks = cb;
|
||||
@ -105,6 +106,17 @@ loader_main(struct loader_callbacks_v1 *cb, void *arg, int version, int ndisks)
|
||||
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user