diff options
Diffstat (limited to 'emu/port')
| -rw-r--r-- | emu/port/chan.c | 1 | ||||
| -rw-r--r-- | emu/port/dev.c | 2 | ||||
| -rw-r--r-- | emu/port/devcmd.c | 88 | ||||
| -rw-r--r-- | emu/port/devcons.c | 334 | ||||
| -rw-r--r-- | emu/port/devmem.c | 1 | ||||
| -rw-r--r-- | emu/port/devprof.c | 18 | ||||
| -rw-r--r-- | emu/port/error.h | 3 | ||||
| -rw-r--r-- | emu/port/exportfs.c | 2 | ||||
| -rw-r--r-- | emu/port/fns.h | 2 | ||||
| -rw-r--r-- | emu/port/inferno.c | 3 |
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); } |
