2 * Copyright (c) 2000 Daniel Capo Sobral
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/sys/boot/ficl/loader.c,v 1.1.2.1 2000/07/06 23:44:59 obrien Exp $
27 * $DragonFly: src/sys/boot/ficl/loader.c,v 1.2 2003/06/17 04:28:17 dillon Exp $
30 /*******************************************************************
32 ** Additional FICL words designed for FreeBSD's loader
34 *******************************************************************/
37 #include "bootstrap.h"
41 /* FreeBSD's loader interaction words
43 * setenv ( value n name n' -- )
44 * setenv? ( value n name n' flag -- )
45 * getenv ( addr n -- addr' n' | -1 )
46 * unsetenv ( addr n -- )
47 * copyin ( addr addr' len -- )
48 * copyout ( addr addr' len -- )
52 ficlSetenv(FICL_VM *pVM)
54 char *namep, *valuep, *name, *value;
58 vmCheckStack(pVM, 4, 0);
60 names = stackPopINT(pVM->pStack);
61 namep = (char*) stackPopPtr(pVM->pStack);
62 values = stackPopINT(pVM->pStack);
63 valuep = (char*) stackPopPtr(pVM->pStack);
65 name = (char*) ficlMalloc(names+1);
67 vmThrowErr(pVM, "Error: out of memory");
68 strncpy(name, namep, names);
70 value = (char*) ficlMalloc(values+1);
72 vmThrowErr(pVM, "Error: out of memory");
73 strncpy(value, valuep, values);
76 setenv(name, value, 1);
84 ficlSetenvq(FICL_VM *pVM)
86 char *namep, *valuep, *name, *value;
87 int names, values, overwrite;
90 vmCheckStack(pVM, 5, 0);
92 overwrite = stackPopINT(pVM->pStack);
93 names = stackPopINT(pVM->pStack);
94 namep = (char*) stackPopPtr(pVM->pStack);
95 values = stackPopINT(pVM->pStack);
96 valuep = (char*) stackPopPtr(pVM->pStack);
98 name = (char*) ficlMalloc(names+1);
100 vmThrowErr(pVM, "Error: out of memory");
101 strncpy(name, namep, names);
103 value = (char*) ficlMalloc(values+1);
105 vmThrowErr(pVM, "Error: out of memory");
106 strncpy(value, valuep, values);
107 value[values] = '\0';
109 setenv(name, value, overwrite);
117 ficlGetenv(FICL_VM *pVM)
119 char *namep, *name, *value;
123 vmCheckStack(pVM, 2, 2);
125 names = stackPopINT(pVM->pStack);
126 namep = (char*) stackPopPtr(pVM->pStack);
128 name = (char*) ficlMalloc(names+1);
130 vmThrowErr(pVM, "Error: out of memory");
131 strncpy(name, namep, names);
134 value = getenv(name);
138 stackPushPtr(pVM->pStack, value);
139 stackPushINT(pVM->pStack, strlen(value));
141 stackPushINT(pVM->pStack, -1);
147 ficlUnsetenv(FICL_VM *pVM)
153 vmCheckStack(pVM, 2, 0);
155 names = stackPopINT(pVM->pStack);
156 namep = (char*) stackPopPtr(pVM->pStack);
158 name = (char*) ficlMalloc(names+1);
160 vmThrowErr(pVM, "Error: out of memory");
161 strncpy(name, namep, names);
171 ficlCopyin(FICL_VM *pVM)
178 vmCheckStack(pVM, 3, 0);
181 len = stackPopINT(pVM->pStack);
182 dest = stackPopINT(pVM->pStack);
183 src = stackPopPtr(pVM->pStack);
185 archsw.arch_copyin(src, dest, len);
191 ficlCopyout(FICL_VM *pVM)
198 vmCheckStack(pVM, 3, 0);
201 len = stackPopINT(pVM->pStack);
202 dest = stackPopPtr(pVM->pStack);
203 src = stackPopINT(pVM->pStack);
205 archsw.arch_copyout(src, dest, len);