Add a callback function to userboot.so to fetch a list of environment
variables and pass them to the kernel. Reviewed by: dfr
This commit is contained in:
parent
66400b6a10
commit
2161a344ab
@ -364,6 +364,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 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);
|
||||
}
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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, 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