Skip site navigation (1)Skip section navigation (2)
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>