ref: f86de033419f1c8733da7d05a9b824bcdb6c3aac
parent: 693f5ff94696f7386d9adb6310b5cebb954bd64f
author: 9ferno <gophone2015@gmail.com>
date: Tue Nov 9 16:36:02 EST 2021
fixed bug when setenv is used with an empty value
--- a/appl/cmd/sh/sh.b
+++ b/appl/cmd/sh/sh.b
@@ -1536,11 +1536,23 @@
return ref Listnode(nil, v[0:start]) :: val;
}
+# the correct way to set environment variables is to
+# be able to catch errors if there is a failure.
+# this is not happening and is propogating to a triple fault.
+# the shell should run this in an exception handler
+# When value is nil, setenv() tries to remove the
+# env file. If the file does not already exist,
+# that raises an unhandled exception which is causing a triple
+# fault
setenv(name: string, val: list of ref Listnode)
{
if (env == nil)
return;
- env->setenv(name, quoted(val, 1));
+ valstr := quoted(val, 1);
+ if(valstr == nil && getenv(name) == nil){
+ return;
+ }
+ env->setenv(name, valstr);
}
--- a/dis/init
+++ b/dis/init
@@ -4,9 +4,7 @@
# configure boot devices
# setup /
# sh -n /dis/init
-
-# disinit.b does this but not sure why it loses it later
-bind -c '#e' /env
+# -n to avoid forking the namespace and losing the binds created by disinit.b
load std
mount {mntgen} /n
--- a/libinterp/xec.c
+++ b/libinterp/xec.c
@@ -7,7 +7,7 @@
REG R; /* Virtual Machine registers */
String snil; /* String known to be zero length */
-#define DP if(1){}else print
+#define DBG if(0)print
#define Stmp *((WORD*)(R.FP+NREG*IBY2WD))
#define Dtmp *((WORD*)(R.FP+(NREG+2)*IBY2WD))
@@ -220,7 +220,7 @@
a = A(s);
i = W(d);
- DP("indx a %p a->len %zd i %zd\n", a, a->len, i);
+ DBG("indx a %p a->len %zd i %zd\n", a, a->len, i);
if(a == H || i >= a->len){
print("indx a %p a->len %zd i %zd\n", a, a->len, i);
error(exBounds);
@@ -234,7 +234,7 @@
a = A(s);
i = W(d);
- DP("indw a %p a->len %zd i %zd\n", a, a->len, i);
+ DBG("indw a %p a->len %zd i %zd\n", a, a->len, i);
if(a == H || i >= a->len){
print("indw a %p a->len %zd i %zd\n", a, a->len, i);
error(exBounds);
@@ -248,7 +248,7 @@
a = A(s);
i = W(d);
- DP("indf a %p a->len %zd i %zd\n", a, a->len, i);
+ DBG("indf a %p a->len %zd i %zd\n", a, a->len, i);
if(a == H || i >= a->len){
print("indf a %p a->len %zd i %zd\n", a, a->len, i);
error(exBounds);
@@ -262,7 +262,7 @@
a = A(s);
i = W(d);
- DP("indl a %p a->len %zd i %zd\n", a, a->len, i);
+ DBG("indl a %p a->len %zd i %zd\n", a, a->len, i);
if(a == H || i >= a->len){
print("indl a %p a->len %zd i %zd\n", a, a->len, i);
error(exBounds);
@@ -276,7 +276,7 @@
a = A(s);
i = W(d);
- DP("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
+ DBG("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
if(a == H || i >= a->len){
print("indb a %p a->len %zd a->data 0x%p i %zd\n", a, a->len, a->data, i);
error(exBounds);
@@ -364,7 +364,7 @@
R.SP = nsp;
f->t = t;
f->mr = nil;
- DP("frame frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
+ DBG("frame frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
f, t, t->size, R.SP);
if (t->np)
initmem(t, f);
@@ -398,7 +398,7 @@
R.s = t;
extend();
T(d) = R.s;
- DP("\t\textended frame at *R.d 0x%p\n", *(intptr**)R.d);
+ DBG("\t\textended frame at *R.d 0x%p\n", *(intptr**)R.d);
return;
}
f = (Frame*)R.SP;
@@ -405,12 +405,12 @@
R.SP = nsp;
f->t = t;
f->mr = nil;
- DP("\t\tmframe frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
+ DBG("\t\tmframe frame 0x%p t 0x%p t->size %d R.SP 0x%p\n",
f, t, t->size, R.SP);
if (t->np)
initmem(t, f);
T(d) = f;
- DP("\t\tframe at *R.d 0x%p is\n", *(intptr**)R.d);
+ DBG("\t\tframe at *R.d 0x%p is\n", *(intptr**)R.d);
if(0) showframe((void *)f, t);
}
void
@@ -715,7 +715,7 @@
void
showREG(void)
{
- DP("REG PC 0x%p MP 0x%p FP 0x%p SP 0x%p\n"
+ DBG("REG PC 0x%p MP 0x%p FP 0x%p SP 0x%p\n"
"\tTS 0x%p EX 0x%p M 0x%p IC %d\n"
"\txpc 0x%p s 0x%p d 0x%p m 0x%p\n",
R.PC, R.MP, R.FP, R.SP,
@@ -729,7 +729,7 @@
showREG();
f = (Frame*)R.FP;
- DP("Frame at 0x%p lr 0x%p fp 0x%p mr 0x%p t 0x%p\n",
+ DBG("Frame at 0x%p lr 0x%p fp 0x%p mr 0x%p t 0x%p\n",
f, f->lr, f->fp, f->mr, f->t);
/* showframe((void*)f, f->t); */
R.FP = f->fp;
@@ -778,7 +778,7 @@
error("obsolete dis");
}
- DP("\t\tiload module %s for the ldt index %zd\n", n, W(m));
+ DBG("\t\tiload module %s for the ldt index %zd\n", n, W(m));
if(strcmp(n, "$self") == 0) {
m->ref++;
ml = linkmod(m, ldt, 0);
@@ -821,19 +821,19 @@
h = D2H(ml);
h->ref++;
- DP("\t\tmcall frame at *R.s 0x%p is\n", f);
+ DBG("\t\tmcall frame at *R.s 0x%p is\n", f);
if(0 && f->t != nil)
showframe((void *)f, f->t);
o = W(m);
if(o >= 0){
l = &ml->links[o].u;
- DP("\t\tlink o %d %s\n",
+ DBG("\t\tlink o %d %s\n",
o, ml->links[o].name);
- DP("\t\text o %d %s sig 0x%x\n",
+ DBG("\t\text o %d %s sig 0x%x\n",
o, ml->m->ext[o].name, ml->m->ext[o].sig);
}else{
l = &ml->m->ext[-o-1].u;
- DP("\t\text o %d %s sig 0x%x\n",
+ DBG("\t\text o %d %s sig 0x%x\n",
-o-1, ml->m->ext[-o-1].name, ml->m->ext[-o-1].sig);
}
if(ml->prog == nil) {
@@ -864,11 +864,12 @@
WORD l;
Array *a;
+ DBG("lena R.s 0x%zx\n", R.s);
a = A(s);
l = 0;
if(a != H)
l = a->len;
- DP("lena after A(s) l %zd a->len %zd\n", l, a->len);
+ DBG("lena after A(s) l %zd a->len %zd\n", l, a->len);
W(d) = l;
}
OP(lenl)
@@ -1733,9 +1734,9 @@
Stkext *sx;
uchar *fp, *sp, *ex;
- DP("Prog state %d pid %d ticks %lud\n",
+ DBG("Prog state %d pid %d ticks %lud\n",
p->state, p->pid, p->ticks);
- DP("\tpc 0x%p module %s %s\n",
+ DBG("\tpc 0x%p module %s %s\n",
p->R.PC, p->R.M->m->name, p->R.M->m->path);
sp = p->R.SP;
ex = p->R.EX;
@@ -1748,7 +1749,7 @@
if(t == nil)
t = sx->reg.TR;
fp += t->size;
- DP("\tFrame 0x%p type 0x%p type size %d\n",
+ DBG("\tFrame 0x%p type 0x%p type size %d\n",
f, t, t->size);
}
ex = sx->reg.EX;
@@ -1777,7 +1778,7 @@
if(R.M->compiled)
comvec();
else do {
- DP("step: %p: %s pid %d state %d %4zd %D:\tR.PC->op=0x%x R.PC->add=0x%x\n",
+ DBG("step: %p: %s pid %d state %d %4zd %D:\tR.PC->op=0x%x R.PC->add=0x%x\n",
p, R.M->m->name, p->pid, p->state, R.PC-R.M->prog, R.PC, R.PC->op,
R.PC->add);
dec[R.PC->add]();
@@ -1784,14 +1785,15 @@
op = R.PC->op;
R.PC++;
optab[op]();
- DP(" end: %p: ", p);
- DP("%s ", R.M->m->name);
- DP("pid %d ", p->pid);
- DP("state %d", p->state);
- DP(" %4zd", R.PC-R.M->prog);
- DP(" %D:\t", R.PC);
- DP("R.PC->op=0x%x ", R.PC->op);
- DP("R.PC->add=0x%x\n", R.PC->add);
+/* DBG(" end: %p: ", p);
+ DBG("%s ", R.M->m->name);
+ DBG("pid %d ", p->pid);
+ DBG("state %d", p->state);
+ DBG(" %4zd", R.PC-R.M->prog);
+ DBG(" %D:\t", R.PC);
+ DBG("R.PC->op=0x%x ", R.PC->op);
+ DBG("R.PC->add=0x%x\n", R.PC->add);
+*/
} while(--R.IC != 0);
p->R = R;
--- a/os/init/disinit.b
+++ b/os/init/disinit.b
@@ -62,13 +62,14 @@
#sys->print("srv()\n");
#srv();
+ # using -n to use this namespace instead of re-creating the binds above
sys->print("loading /dis/sh.dis\n");
sh := load Sh "/dis/sh.dis";
(s, nil) := sys->stat("/dis/init");
if(s == 0){
- sys->print("spawn sh /dis/init\n");
+ sys->print("spawn sh -n -x /dis/init\n");
{
- sh->init(nil, "sh" :: "/dis/init" :: nil);
+ sh->init(nil, "sh" :: "-n" :: "-x" :: "/dis/init" :: nil);
} exception e {
"*" =>
sys->fprint(stderr, "dis/init status: %s\nStarting fallback shell\n", e);
@@ -75,13 +76,13 @@
# fallback console
sh1 := load Sh "/dis/sh.dis";
sys->print("sh -x\n");
- sh1->init(nil, "sh" :: "-x" :: nil);
+ sh1->init(nil, "sh" :: "-n" :: "-x" :: nil);
}
}{
# fallback console
sh1 := load Sh "/dis/sh.dis";
- sys->print("sh -x\n");
- sh1->init(nil, "sh" :: "-x" :: nil);
+ sys->print("sh -n -x\n");
+ sh1->init(nil, "sh" :: "-n" :: "-x" :: nil);
}
}
--- a/os/pc64/pc64
+++ b/os/pc64/pc64
@@ -176,6 +176,7 @@
/nvfs /
/prog /
/tmp /
+ /proc /
/dis/lib
/dis/svc
/dis/wm
--- a/os/port/dis.c
+++ b/os/port/dis.c
@@ -9,9 +9,9 @@
#include <kernel.h>
#include "raise.h"
-#define DP if(1){}else print
+#define DBG if(0)print
- void vmachine(void*);
+void vmachine(void*);
struct
{
@@ -225,9 +225,9 @@
Prog **ph;
if(p->exstr != nil)
- DP("delprog p->pid %d msg %s p->exstr %s\n", p->pid, msg, p->exstr);
+ DBG("delprog p->pid %d msg %s p->exstr %s\n", p->pid, msg, p->exstr);
else
- DP("delprog p->pid %d msg --%s--\n", p->pid, msg);
+ DBG("delprog p->pid %d msg --%s--\n", p->pid, msg);
tellsomeone(p, msg); /* call before being removed from prog list */
o = p->osenv;
@@ -288,10 +288,10 @@
Osenv *o;
int ret;
- DP("tellsomeone pid %d buf %s\n", p->pid, buf);
+ DBG("tellsomeone pid %d buf %s\n", p->pid, buf);
if(waserror())
return;
- DP("tellsomeone after waserror() pid %d buf %s\n", p->pid, buf);
+ DBG("tellsomeone after waserror() pid %d buf %s\n", p->pid, buf);
o = p->osenv;
if(o->childq != nil){
ret = qproduce(o->childq, buf, strlen(buf));
@@ -958,7 +958,7 @@
estr = up->env->errstr;
broken = 0;
- DP("progexit estr %s\n", estr);
+ DBG("progexit estr %s\n", estr);
if(estr[0] != '\0' && strcmp(estr, Eintr) != 0 && strncmp(estr, "fail:", 5) != 0)
broken = 1;
@@ -974,7 +974,7 @@
m = R.M->m;
if(broken){
if(cflag){ /* only works on Plan9 for now */
- DP("progexit cflag set\n");
+ DBG("progexit cflag set\n");
char *pc = strstr(estr, "pc=");
if(pc != nil)
@@ -984,18 +984,18 @@
}
if(r->exstr != nil)
- DP("progexit pid %d name %s estr %s exval %p exstr %s\n",
+ DBG("progexit pid %d name %s estr %s exval %p exstr %s\n",
r->pid, m->name, estr, r->exval, r->exstr);
else
- DP("progexit pid %d name %s estr %s exval %p\n",
+ DBG("progexit pid %d name %s estr %s exval %p\n",
r->pid, m->name, estr, r->exval);
// sh.b is matching on fail: not on "<pid> fail: "
snprint(msg, sizeof(msg), "%d \"%s\":%s", r->pid, m->name, estr);
// snprint(msg, sizeof(msg), "%s", estr);
- DP("progexit msg %s\n", msg);
+ DBG("progexit msg %s\n", msg);
if(up->env->debug != nil) {
- DP("progexit debug set\n");
+ DBG("progexit debug set\n");
dbgexit(r, broken, estr);
broken = 1;
/* must force it to break if in debug */
@@ -1008,7 +1008,6 @@
r->state = Pbroken;
return;
}
-
gclock();
destroystack(&R);
delprog(r, msg);