Date: Mon, 12 Nov 2012 22:38:54 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r242935 - in head/sys/boot/userboot: . test userboot Message-ID: <201211122238.qACMcsbd022228@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211122238.qACMcsbd022228>