summaryrefslogtreecommitdiff
path: root/emu/port
diff options
context:
space:
mode:
Diffstat (limited to 'emu/port')
-rw-r--r--emu/port/chan.c1
-rw-r--r--emu/port/dev.c2
-rw-r--r--emu/port/devcmd.c88
-rw-r--r--emu/port/devcons.c334
-rw-r--r--emu/port/devmem.c1
-rw-r--r--emu/port/devprof.c18
-rw-r--r--emu/port/error.h3
-rw-r--r--emu/port/exportfs.c2
-rw-r--r--emu/port/fns.h2
-rw-r--r--emu/port/inferno.c3
10 files changed, 260 insertions, 194 deletions
diff --git a/emu/port/chan.c b/emu/port/chan.c
index 697d92c4..997cb876 100644
--- a/emu/port/chan.c
+++ b/emu/port/chan.c
@@ -1297,7 +1297,6 @@ if(c->umh != nil){
omode |= OTRUNC;
goto Open;
}
- panic("namec: not reached");
default:
panic("unknown namec access %d\n", amode);
diff --git a/emu/port/dev.c b/emu/port/dev.c
index 8bd1da5f..5df62ecc 100644
--- a/emu/port/dev.c
+++ b/emu/port/dev.c
@@ -249,8 +249,6 @@ devstat(Chan *c, uchar *db, int n, Dirtab *tab, int ntab, Devgen *gen)
}
break;
}
- error(Egreg); /* not reached? */
- return -1;
}
long
diff --git a/emu/port/devcmd.c b/emu/port/devcmd.c
index 4822c49a..f6cccf39 100644
--- a/emu/port/devcmd.c
+++ b/emu/port/devcmd.c
@@ -10,6 +10,7 @@ enum
Qconvdir,
Qconvbase,
Qdata = Qconvbase,
+ Qstderr,
Qctl,
Qstatus,
Qwait,
@@ -25,10 +26,8 @@ struct Conv
{
int x;
int inuse;
- int wcount;
- int rcount;
- int rfd;
- int wfd;
+ int fd[3]; /* stdin, stdout, and stderr */
+ int count[3]; /* number of readers on stdin/stdout/stderr */
int perm;
char* owner;
char* state;
@@ -69,6 +68,10 @@ cmd3gen(Chan *c, int i, Dir *dp)
mkqid(&q, QID(CONV(c->qid), Qdata), 0, QTFILE);
devdir(c, q, "data", 0, cv->owner, cv->perm, dp);
return 1;
+ case Qstderr:
+ mkqid(&q, QID(CONV(c->qid), Qstderr), 0, QTFILE);
+ devdir(c, q, "stderr", 0, cv->owner, 0444, dp);
+ return 1;
case Qctl:
mkqid(&q, QID(CONV(c->qid), Qctl), 0, QTFILE);
devdir(c, q, "ctl", 0, cv->owner, cv->perm, dp);
@@ -143,6 +146,7 @@ cmdgen(Chan *c, char *name, Dirtab *d, int nd, int s, Dir *dp)
case Qconvdir:
return cmd3gen(c, Qconvbase+s, dp);
case Qdata:
+ case Qstderr:
case Qctl:
case Qstatus:
case Qwait:
@@ -154,7 +158,7 @@ cmdgen(Chan *c, char *name, Dirtab *d, int nd, int s, Dir *dp)
static void
cmdinit(void)
{
- cmd.maxconv = 100;
+ cmd.maxconv = 1000;
cmd.conv = mallocz(sizeof(Conv*)*(cmd.maxconv+1), 1);
/* cmd.conv is checked by cmdattach, below */
}
@@ -228,6 +232,7 @@ cmdopen(Chan *c, int omode)
mkqid(&c->qid, QID(cv->x, Qctl), 0, QTFILE);
break;
case Qdata:
+ case Qstderr:
case Qctl:
case Qwait:
qlock(&cmd.l);
@@ -247,10 +252,14 @@ cmdopen(Chan *c, int omode)
switch(TYPE(c->qid)){
case Qdata:
if(omode == OWRITE || omode == ORDWR)
- cv->wcount++;
+ cv->count[0]++;
if(omode == OREAD || omode == ORDWR)
- cv->rcount++;
- c->mode = omode;
+ cv->count[1]++;
+ break;
+ case Qstderr:
+ if(omode != OREAD)
+ error(Eperm);
+ cv->count[2]++;
break;
case Qwait:
if(cv->waitq == nil)
@@ -269,7 +278,7 @@ cmdopen(Chan *c, int omode)
qunlock(&cmd.l);
break;
}
- c->mode = openmode(omode);
+ c->mode = omode;
c->flag |= COPEN;
c->offset = 0;
return c;
@@ -296,6 +305,15 @@ closeconv(Conv *c)
}
static void
+cmdfdclose(Conv *c, int fd)
+{
+ if(--c->count[fd] == 0 && c->fd[fd] != -1){
+ close(c->fd[fd]);
+ c->fd[fd] = -1;
+ }
+}
+
+static void
cmdclose(Chan *c)
{
Conv *cc;
@@ -307,23 +325,17 @@ cmdclose(Chan *c)
switch(TYPE(c->qid)) {
case Qctl:
case Qdata:
+ case Qstderr:
case Qwait:
cc = cmd.conv[CONV(c->qid)];
qlock(&cc->l);
if(TYPE(c->qid) == Qdata){
- if(c->mode == OWRITE || c->mode == ORDWR){
- if(--cc->wcount == 0 && cc->wfd != -1){
- close(cc->wfd);
- cc->wfd = -1;
- }
- }
- if(c->mode == OREAD || c->mode == ORDWR){
- if(--cc->rcount == 0 && cc->rfd != -1){
- close(cc->rfd);
- cc->rfd = -1;
- }
- }
- }
+ if(c->mode == OWRITE || c->mode == ORDWR)
+ cmdfdclose(cc, 0);
+ if(c->mode == OREAD || c->mode == ORDWR)
+ cmdfdclose(cc, 1);
+ }else if(TYPE(c->qid) == Qstderr)
+ cmdfdclose(cc, 2);
r = --cc->inuse;
if(cc->child != nil){
@@ -345,6 +357,7 @@ cmdread(Chan *ch, void *a, long n, vlong offset)
{
Conv *c;
char *p, *cmds;
+ int fd;
USED(offset);
@@ -368,15 +381,19 @@ cmdread(Chan *ch, void *a, long n, vlong offset)
c->x, c->inuse, c->state, c->dir, cmds);
return readstr(offset, p, n, up->genbuf);
case Qdata:
+ case Qstderr:
+ fd = 1;
+ if(TYPE(ch->qid) == Qstderr)
+ fd = 2;
c = cmd.conv[CONV(ch->qid)];
qlock(&c->l);
- if(c->rfd == -1){
+ if(c->fd[fd] == -1){
qunlock(&c->l);
return 0;
}
qunlock(&c->l);
osenter();
- n = read(c->rfd, a, n);
+ n = read(c->fd[fd], a, n);
osleave();
if(n < 0)
oserror();
@@ -393,7 +410,7 @@ cmdstarted(void *a)
Conv *c;
c = a;
- return c->child != nil || c->error != nil;
+ return c->child != nil || c->error != nil || strcmp(c->state, "Execute") != 0;
}
enum
@@ -417,7 +434,7 @@ Cmdtab cmdtab[] = {
static long
cmdwrite(Chan *ch, void *a, long n, vlong offset)
{
- int r;
+ int i, r;
Conv *c;
Cmdbuf *cb;
Cmdtab *ct;
@@ -447,8 +464,11 @@ cmdwrite(Chan *ch, void *a, long n, vlong offset)
free(cb);
nexterror();
}
- if(c->child != nil || c->cmd != nil || c->wfd != -1 || c->rfd != -1)
+ if(c->child != nil || c->cmd != nil)
error(Einuse);
+ for(i = 0; i < nelem(c->fd); i++)
+ if(c->fd[i] != -1)
+ error(Einuse);
if(cb->nf < 1)
error(Etoosmall);
kproc("cmdproc", cmdproc, c, 0); /* cmdproc held back until unlock below */
@@ -490,13 +510,13 @@ cmdwrite(Chan *ch, void *a, long n, vlong offset)
case Qdata:
c = cmd.conv[CONV(ch->qid)];
qlock(&c->l);
- if(c->wfd == -1){
+ if(c->fd[0] == -1){
qunlock(&c->l);
error(Ehungup);
}
qunlock(&c->l);
osenter();
- r = write(c->wfd, a, n);
+ r = write(c->fd[0], a, n);
osleave();
if(r == 0)
error(Ehungup);
@@ -520,6 +540,7 @@ cmdwstat(Chan *c, uchar *dp, int n)
error(Eperm);
case Qctl:
case Qdata:
+ case Qstderr:
d = malloc(sizeof(*d)+n);
if(d == nil)
error(Enomem);
@@ -548,6 +569,7 @@ static Conv*
cmdclone(char *user)
{
Conv *c, **pp, **ep;
+ int i;
c = nil;
ep = &cmd.conv[cmd.maxconv];
@@ -578,8 +600,8 @@ cmdclone(char *user)
kstrdup(&c->dir, rootdir);
c->perm = 0660;
c->state = "Closed";
- c->rfd = -1;
- c->wfd = -1;
+ for(i=0; i<nelem(c->fd); i++)
+ c->fd[i] = -1;
qunlock(&c->l);
return c;
@@ -606,7 +628,7 @@ cmdproc(void *a)
Wakeup(&c->startr);
pexit("cmdproc", 0);
}
- t = oscmd(c->cmd->f+1, c->nice, c->dir, &c->rfd, &c->wfd);
+ t = oscmd(c->cmd->f+1, c->nice, c->dir, c->fd);
if(t == nil)
oserror();
c->child = t; /* to allow oscmdkill */
@@ -629,7 +651,7 @@ cmdproc(void *a)
oscmdfree(t);
if(Debug){
status[n]=0;
- print("done %d %d: %q\n", c->rfd, c->wfd, status);
+ print("done %d %d %d: %q\n", c->fd[0], c->fd[1], c->fd[2], status);
}
if(c->inuse > 0){
c->state = "Done";
diff --git a/emu/port/devcons.c b/emu/port/devcons.c
index efe49838..8e823839 100644
--- a/emu/port/devcons.c
+++ b/emu/port/devcons.c
@@ -107,11 +107,19 @@ kbdslave(void *a)
USED(a);
for(;;) {
b = readkbd();
- if(kbd.raw == 0)
- write(1, &b, 1);
+ if(kbd.raw == 0){
+ switch(b){
+ case 0x15:
+ write(1, "^U\n", 3);
+ break;
+ default:
+ write(1, &b, 1);
+ break;
+ }
+ }
qproduce(kbdq, &b, 1);
}
- pexit("kbdslave", 0);
+ /* pexit("kbdslave", 0); */ /* not reached */
}
void
@@ -152,13 +160,13 @@ gkbdputc(Queue *q, int ch)
void
consinit(void)
{
- kbdq = qopen(512, 0, 0, 0);
+ kbdq = qopen(512, 0, nil, nil);
if(kbdq == 0)
panic("no memory");
- lineq = qopen(512, 0, 0, 0);
+ lineq = qopen(2*1024, 0, nil, nil);
if(lineq == 0)
panic("no memory");
- gkbdq = qopen(512, 0, 0, 0);
+ gkbdq = qopen(512, 0, nil, nil);
if(gkbdq == 0)
panic("no memory");
randominit();
@@ -178,9 +186,9 @@ consattach(char *spec)
{
static int kp;
- if (kp == 0 && !dflag) {
- kproc("kbd", kbdslave, 0, 0);
+ if(kp == 0 && !dflag) {
kp = 1;
+ kproc("kbd", kbdslave, 0, 0);
}
return devattach('c', spec);
}
@@ -205,34 +213,37 @@ consopen(Chan *c, int omode)
case Qconsctl:
incref(&kbd.ctl);
break;
+
case Qscancode:
qlock(&kbd.gq);
- if(gkscanq || !gkscanid) {
+ if(gkscanq != nil || gkscanid == nil) {
qunlock(&kbd.q);
c->flag &= ~COPEN;
if(gkscanq)
error(Einuse);
else
- error(Ebadarg);
+ error("not supported");
}
gkscanq = qopen(256, 0, nil, nil);
qunlock(&kbd.gq);
break;
+
case Qkprint:
wlock(&kprintq.l);
- if(kprintq.q != nil){
+ if(waserror()){
wunlock(&kprintq.l);
c->flag &= ~COPEN;
- error(Einuse);
+ nexterror();
}
- kprintq.q = qopen(32*1024, 0, 0, 0);
- if(kprintq.q == nil){
- wunlock(&kprintq.l);
- c->flag &= ~COPEN;
+ if(kprintq.q != nil)
+ error(Einuse);
+ kprintq.q = qopen(32*1024, Qcoalesce, nil, nil);
+ if(kprintq.q == nil)
error(Enomem);
- }
qnoblock(kprintq.q, 1);
+ poperror();
wunlock(&kprintq.l);
+ c->iounit = qiomaxatomic;
break;
}
return c;
@@ -246,17 +257,20 @@ consclose(Chan *c)
switch((ulong)c->qid.path) {
case Qconsctl:
+ /* last close of control file turns off raw */
if(decref(&kbd.ctl) == 0)
kbd.raw = 0;
break;
+
case Qscancode:
qlock(&kbd.gq);
if(gkscanq) {
qfree(gkscanq);
- gkscanq = 0;
+ gkscanq = nil;
}
qunlock(&kbd.gq);
break;
+
case Qkprint:
wlock(&kprintq.l);
qfree(kprintq.q);
@@ -267,62 +281,82 @@ consclose(Chan *c)
}
static long
-consread(Chan *c, void *va, long count, vlong offset)
+consread(Chan *c, void *va, long n, vlong offset)
{
- int i, n, ch, eol;
- char *p, buf[64];
+ ulong l;
+ int i, send;
+ char *p, buf[64], ch;
if(c->qid.type & QTDIR)
- return devdirread(c, va, count, contab, nelem(contab), devgen);
+ return devdirread(c, va, n, contab, nelem(contab), devgen);
switch((ulong)c->qid.path) {
default:
error(Egreg);
+
case Qsysctl:
- return readstr(offset, va, count, VERSION);
+ return readstr(offset, va, n, VERSION);
+
case Qsysname:
if(ossysname == nil)
return 0;
- return readstr(offset, va, count, ossysname);
+ return readstr(offset, va, n, ossysname);
+
case Qrandom:
- return randomread(va, count);
+ return randomread(va, n);
+
case Qnotquiterandom:
- genrandom(va, count);
- return count;
+ genrandom(va, n);
+ return n;
+
case Qpin:
p = "pin set";
if(up->env->pgrp->pin == Nopin)
p = "no pin";
- return readstr(offset, va, count, p);
+ return readstr(offset, va, n, p);
+
case Qhostowner:
- return readstr(offset, va, count, eve);
+ return readstr(offset, va, n, eve);
+
case Qhoststdin:
- return read(0, va, count); /* should be pread */
+ return read(0, va, n); /* should be pread */
+
case Quser:
- return readstr(offset, va, count, up->env->user);
+ return readstr(offset, va, n, up->env->user);
+
case Qjit:
snprint(buf, sizeof(buf), "%d", cflag);
- return readstr(offset, va, count, buf);
+ return readstr(offset, va, n, buf);
+
case Qtime:
snprint(buf, sizeof(buf), "%.lld", timeoffset + osusectime());
- return readstr(offset, va, count, buf);
+ return readstr(offset, va, n, buf);
+
case Qdrivers:
p = malloc(READSTR);
if(p == nil)
error(Enomem);
- n = 0;
+ l = 0;
for(i = 0; devtab[i] != nil; i++)
- n += snprint(p+n, READSTR-n, "#%C %s\n", devtab[i]->dc, devtab[i]->name);
- n = readstr(offset, va, count, p);
+ l += snprint(p+l, READSTR-l, "#%C %s\n", devtab[i]->dc, devtab[i]->name);
+ if(waserror()){
+ free(p);
+ nexterror();
+ }
+ n = readstr(offset, va, n, p);
+ poperror();
free(p);
return n;
+
case Qmemory:
- return poolread(va, count, offset);
+ return poolread(va, n, offset);
case Qnull:
return 0;
+
case Qmsec:
- return readnum(offset, va, count, osmillisec(), NUMSIZE);
+ return readnum(offset, va, n, osmillisec(), NUMSIZE);
+
case Qcons:
qlock(&kbd.q);
if(waserror()){
@@ -334,53 +368,60 @@ consread(Chan *c, void *va, long count, vlong offset)
error(Enonexist);
while(!qcanread(lineq)) {
- qread(kbdq, &kbd.line[kbd.x], 1);
- ch = kbd.line[kbd.x];
- if(kbd.raw){
- qiwrite(lineq, &kbd.line[kbd.x], 1);
+ if(qread(kbdq, &ch, 1) == 0)
continue;
- }
- eol = 0;
- switch(ch) {
- case '\b':
- if(kbd.x)
- kbd.x--;
- break;
- case 0x15:
- kbd.x = 0;
- break;
- case '\n':
- case 0x04:
- eol = 1;
- default:
+ send = 0;
+ if(ch == 0){
+ /* flush output on rawoff -> rawon */
+ if(kbd.x > 0)
+ send = !qcanread(kbdq);
+ }else if(kbd.raw){
kbd.line[kbd.x++] = ch;
- break;
+ send = !qcanread(kbdq);
+ }else{
+ switch(ch){
+ case '\b':
+ if(kbd.x)
+ kbd.x--;
+ break;
+ case 0x15:
+ kbd.x = 0;
+ break;
+ case 0x04:
+ send = 1;
+ break;
+ case '\n':
+ send = 1;
+ default:
+ kbd.line[kbd.x++] = ch;
+ break;
+ }
}
- if(kbd.x == sizeof(kbd.line) || eol){
- if(ch == 0x04)
- kbd.x--;
+ if(send || kbd.x == sizeof kbd.line){
qwrite(lineq, kbd.line, kbd.x);
kbd.x = 0;
}
}
- n = qread(lineq, va, count);
+ n = qread(lineq, va, n);
qunlock(&kbd.q);
poperror();
return n;
+
case Qscancode:
if(offset == 0)
- return readstr(0, va, count, gkscanid);
- else
- return qread(gkscanq, va, count);
+ return readstr(0, va, n, gkscanid);
+ return qread(gkscanq, va, n);
+
case Qkeyboard:
- return qread(gkbdq, va, count);
+ return qread(gkbdq, va, n);
+
case Qkprint:
rlock(&kprintq.l);
if(waserror()){
runlock(&kprintq.l);
nexterror();
}
- n = qread(kprintq.q, va, count);
+ n = qread(kprintq.q, va, n);
poperror();
runlock(&kprintq.l);
return n;
@@ -388,19 +429,18 @@ consread(Chan *c, void *va, long count, vlong offset)
}
static long
-conswrite(Chan *c, void *va, long count, vlong offset)
+conswrite(Chan *c, void *va, long n, vlong offset)
{
- char buf[128];
+ char buf[128], *a, ch;
int x;
- USED(offset);
-
if(c->qid.type & QTDIR)
error(Eperm);
switch((ulong)c->qid.path) {
default:
error(Egreg);
+
case Qcons:
if(canrlock(&kprintq.l)){
if(kprintq.q != nil){
@@ -408,105 +448,129 @@ conswrite(Chan *c, void *va, long count, vlong offset)
runlock(&kprintq.l);
nexterror();
}
- qwrite(kprintq.q, va, count);
+ qwrite(kprintq.q, va, n);
poperror();
runlock(&kprintq.l);
- return count;
+ return n;
}
runlock(&kprintq.l);
}
- return write(1, va, count);
+ return write(1, va, n);
+
case Qsysctl:
- return sysconwrite(va, count);
+ return sysconwrite(va, n);
+
case Qconsctl:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = 0;
- if(strncmp(buf, "rawon", 5) == 0) {
- kbd.raw = 1;
- return count;
- }
- else
- if(strncmp(buf, "rawoff", 6) == 0) {
- kbd.raw = 0;
- return count;
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = 0;
+ for(a = buf; a;){
+ if(strncmp(a, "rawon", 5) == 0){
+ kbd.raw = 1;
+ /* clumsy hack - wake up reader */
+ ch = 0;
+ qwrite(kbdq, &ch, 1);
+ } else if(strncmp(buf, "rawoff", 6) == 0){
+ kbd.raw = 0;
+ }
+ if((a = strchr(a, ' ')) != nil)
+ a++;
}
- error(Ebadctl);
+ break;
+
case Qkeyboard:
- for(x=0; x<count; ) {
+ for(x=0; x<n; ) {
Rune r;
x += chartorune(&r, &((char*)va)[x]);
gkbdputc(gkbdq, r);
}
- return count;
+ break;
+
case Qnull:
- return count;
+ break;
+
case Qpin:
if(up->env->pgrp->pin != Nopin)
error("pin already set");
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
up->env->pgrp->pin = atoi(buf);
- return count;
+ break;
+
case Qtime:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
timeoffset = strtoll(buf, 0, 0)-osusectime();
- return count;
- case Quser:
- if(count >= sizeof(buf))
+ break;
+
+ case Qhostowner:
+ if(!iseve())
+ error(Eperm);
+ if(offset != 0 || n >= sizeof(buf))
error(Ebadarg);
- strncpy(buf, va, count);
- buf[count] = '\0';
- if(count > 0 && buf[count-1] == '\n')
- buf[--count] = '\0';
- if(count == 0)
+ memmove(buf, va, n);
+ buf[n] = '\0';
+ if(n > 0 && buf[n-1] == '\n')
+ buf[--n] = '\0';
+ if(n == 0)
error(Ebadarg);
- if(strcmp(up->env->user, eve) != 0)
+ /* renameuser(eve, buf); */
+ /* renameproguser(eve, buf); */
+ kstrdup(&eve, buf);
+ kstrdup(&up->env->user, buf);
+ break;
+
+ case Quser:
+ if(!iseve())
error(Eperm);
- setid(buf, 0);
- return count;
- case Qhostowner:
- if(count >= sizeof(buf))
+ if(offset != 0)
error(Ebadarg);
- strncpy(buf, va, count);
- buf[count] = '\0';
- if(count > 0 && buf[count-1] == '\n')
- buf[--count] = '\0';
- if(count == 0)
+ if(n <= 0 || n >= sizeof(buf))
error(Ebadarg);
- if(strcmp(up->env->user, eve) != 0)
- error(Eperm);
- kstrdup(&eve, buf);
- return count;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
+ if(n > 0 && buf[n-1] == '\n')
+ buf[--n] = '\0';
+ if(n == 0)
+ error(Ebadarg);
+ setid(buf, 0);
+ break;
+
case Qhoststdout:
- return write(1, va, count);
+ return write(1, va, n);
+
case Qhoststderr:
- return write(2, va, count);
+ return write(2, va, n);
+
case Qjit:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(n >= sizeof(buf))
+ n = sizeof(buf)-1;
+ strncpy(buf, va, n);
+ buf[n] = '\0';
x = atoi(buf);
- if (x < 0 || x > 9)
+ if(x < 0 || x > 9)
error(Ebadarg);
cflag = x;
- return count;
+ break;
+
case Qsysname:
- if(count >= sizeof(buf))
- count = sizeof(buf)-1;
- strncpy(buf, va, count);
- buf[count] = '\0';
+ if(offset != 0)
+ error(Ebadarg);
+ if(n < 0 || n >= sizeof(buf))
+ error(Ebadarg);
+ strncpy(buf, va, n);
+ buf[n] = '\0';
+ if(buf[n-1] == '\n')
+ buf[n-1] = 0;
kstrdup(&ossysname, buf);
- return count;
+ break;
}
- return 0;
+ return n;
}
static int
diff --git a/emu/port/devmem.c b/emu/port/devmem.c
index 6c09aaad..78f772c6 100644
--- a/emu/port/devmem.c
+++ b/emu/port/devmem.c
@@ -438,7 +438,6 @@ memread(Chan *c, void *va, long count, vlong offset)
free(s);
return count;
}
- return 0;
}
static long
diff --git a/emu/port/devprof.c b/emu/port/devprof.c
index f3a768c3..86d6d962 100644
--- a/emu/port/devprof.c
+++ b/emu/port/devprof.c
@@ -666,8 +666,6 @@ enum{
Mialloc,
};
-#ifdef HEAP_ALIGN
-
static void
memprof(int c, void *v, ulong n)
{
@@ -703,7 +701,7 @@ memprof(int c, void *v, ulong n)
i = p-r->base;
k = (r->id<<24) | i;
if(c == Mhalloc){
- h->pad = k;
+ h->hprof = k;
j = hmsize(h)-sizeof(Heap);
}
else if(c == Mmalloc){
@@ -721,7 +719,7 @@ memprof(int c, void *v, ulong n)
else if(c == Mifree)
k = ((ulong*)v)[1];
else
- k = h->pad;
+ k = h->hprof;
if((r = getrec(k>>24)) == nil){
unlock(&profile.l);
return;
@@ -766,18 +764,6 @@ memprof(int c, void *v, ulong n)
unlock(&profile.l);
}
-#else
-
-static void
-memprof(int c, void *v, ulong n)
-{
- USED(c);
- USED(v);
- USED(n);
-}
-
-#endif
-
/* main and image memory */
static void
memprofmi(int c, ulong pc, ulong v, ulong n)
diff --git a/emu/port/error.h b/emu/port/error.h
index b1911397..e6d61d9d 100644
--- a/emu/port/error.h
+++ b/emu/port/error.h
@@ -32,9 +32,6 @@ extern char Ehungup[]; /* i/o on hungup channel */
extern char Ebadctl[]; /* bad process or channel control request */
extern char Enodev[]; /* no free devices */
extern char Enoenv[]; /* no free environment resources */
-extern char Emuxshutdown[]; /* mux server shut down */
-extern char Emuxbusy[]; /* all mux channels busy */
-extern char Emuxmsg[]; /* bad mux message format or mismatch */
extern char Ethread[]; /* thread exited */
extern char Enochild[]; /* no living children */
extern char Eioload[]; /* i/o error in demand load */
diff --git a/emu/port/exportfs.c b/emu/port/exportfs.c
index e88c5ad3..1feae7ae 100644
--- a/emu/port/exportfs.c
+++ b/emu/port/exportfs.c
@@ -610,8 +610,6 @@ exslave(void *a)
notkilled();
exfreeq(q);
}
- print("exslave %ld shut down", up->pid); /* not reached */
- pexit("exslave shut down", 0);
}
static void
diff --git a/emu/port/fns.h b/emu/port/fns.h
index 393a5c35..effdbe33 100644
--- a/emu/port/fns.h
+++ b/emu/port/fns.h
@@ -118,7 +118,7 @@ void nexterror(void);
void notkilled(void);
int openmode(ulong);
void osblock(void);
-void* oscmd(char**, int, char*, int*, int*);
+void* oscmd(char**, int, char*, int*);
int oscmdwait(void*, char*, int);
int oscmdkill(void*);
void oscmdfree(void*);
diff --git a/emu/port/inferno.c b/emu/port/inferno.c
index 736644be..1149d623 100644
--- a/emu/port/inferno.c
+++ b/emu/port/inferno.c
@@ -585,6 +585,7 @@ Sys_dial(void *fp)
return;
f->ret->t1.dfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
f->ret->t1.cfd = mkfd(cfd);
retstr(dir, &f->ret->t1.dir);
}
@@ -608,6 +609,7 @@ Sys_announce(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}
@@ -631,6 +633,7 @@ Sys_listen(void *fp)
return;
f->ret->t1.cfd = mkfd(f->ret->t0);
+ f->ret->t0 = 0;
retstr(dir, &f->ret->t1.dir);
}