From owner-svn-src-head@FreeBSD.ORG Mon Nov 12 22:38:54 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C303DF9B; Mon, 12 Nov 2012 22:38:54 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id A7FC48FC12; Mon, 12 Nov 2012 22:38:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qACMcsQ6022231; Mon, 12 Nov 2012 22:38:54 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qACMcsbd022228; Mon, 12 Nov 2012 22:38:54 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201211122238.qACMcsbd022228@svn.freebsd.org> From: Neel Natu Date: Mon, 12 Nov 2012 22:38:54 +0000 (UTC) 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 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Nov 2012 22:38:54 -0000 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;