summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2010-01-10 22:34:18 +0000
committerimp <imp@FreeBSD.org>2010-01-10 22:34:18 +0000
commit25563df1b04a79aa358a48f607b24085ce827a5c (patch)
treeea477f952080df110349b6e272411813f8cc650a /sys/kern
parenteb5b31391104d4c0be665d974bc56cc15c20e0af (diff)
downloadFreeBSD-src-25563df1b04a79aa358a48f607b24085ce827a5c.zip
FreeBSD-src-25563df1b04a79aa358a48f607b24085ce827a5c.tar.gz
Merge change r198561 from projects/mips to head:
r198561 | thompsa | 2009-10-28 15:25:22 -0600 (Wed, 28 Oct 2009) | 4 lines Allow a scratch buffer to be set in order to be able to use setenv() while booting, before dynamic kenv is running. A few platforms implement their own scratch+sprintf handling to save data from the boot environment.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_environment.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/sys/kern/kern_environment.c b/sys/kern/kern_environment.c
index fc0039a..73551f4 100644
--- a/sys/kern/kern_environment.c
+++ b/sys/kern/kern_environment.c
@@ -60,6 +60,8 @@ static MALLOC_DEFINE(M_KENV, "kenv", "kernel environment");
/* pointer to the static environment */
char *kern_envp;
+static int env_len;
+static int env_pos;
static char *kernenv_next(char *);
/* dynamic environment variables */
@@ -208,6 +210,14 @@ done:
return (error);
}
+void
+init_static_kenv(char *buf, size_t len)
+{
+ kern_envp = buf;
+ env_len = len;
+ env_pos = 0;
+}
+
/*
* Setup the dynamic kernel environment.
*/
@@ -336,6 +346,26 @@ testenv(const char *name)
return (0);
}
+static int
+setenv_static(const char *name, const char *value)
+{
+ int len;
+
+ if (env_pos >= env_len)
+ return (-1);
+
+ /* Check space for x=y and two nuls */
+ len = strlen(name) + strlen(value);
+ if (len + 3 < env_len - env_pos) {
+ len = sprintf(&kern_envp[env_pos], "%s=%s", name, value);
+ env_pos += len+1;
+ kern_envp[env_pos] = '\0';
+ return (0);
+ } else
+ return (-1);
+
+}
+
/*
* Set an environment variable by name.
*/
@@ -345,6 +375,9 @@ setenv(const char *name, const char *value)
char *buf, *cp, *oldenv;
int namelen, vallen, i;
+ if (dynamic_kenv == 0 && env_len > 0)
+ return (setenv_static(name, value));
+
KENV_CHECK;
namelen = strlen(name) + 1;
OpenPOWER on IntegriCloud