summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
Diffstat (limited to 'emu')
-rw-r--r--emu/port/devcons.c38
-rw-r--r--emu/port/devtinyfs.c40
-rw-r--r--emu/port/inferno.c1
-rw-r--r--emu/port/pgrp.c26
4 files changed, 38 insertions, 67 deletions
diff --git a/emu/port/devcons.c b/emu/port/devcons.c
index 8e823839..93dc6fd6 100644
--- a/emu/port/devcons.c
+++ b/emu/port/devcons.c
@@ -27,7 +27,6 @@ enum
Qmsec,
Qnotquiterandom,
Qnull,
- Qpin,
Qrandom,
Qscancode,
Qsysctl,
@@ -53,7 +52,6 @@ Dirtab contab[] =
"msec", {Qmsec}, NUMSIZE, 0444,
"notquiterandom", {Qnotquiterandom}, 0, 0444,
"null", {Qnull}, 0, 0666,
- "pin", {Qpin}, 0, 0666,
"random", {Qrandom}, 0, 0444,
"scancode", {Qscancode}, 0, 0444,
"sysctl", {Qsysctl}, 0, 0644,
@@ -283,8 +281,7 @@ consclose(Chan *c)
static long
consread(Chan *c, void *va, long n, vlong offset)
{
- ulong l;
- int i, send;
+ int send;
char *p, buf[64], ch;
if(c->qid.type & QTDIR)
@@ -309,12 +306,6 @@ consread(Chan *c, void *va, long n, vlong offset)
genrandom(va, n);
return n;
- case Qpin:
- p = "pin set";
- if(up->env->pgrp->pin == Nopin)
- p = "no pin";
- return readstr(offset, va, n, p);
-
case Qhostowner:
return readstr(offset, va, n, eve);
@@ -333,20 +324,7 @@ consread(Chan *c, void *va, long n, vlong offset)
return readstr(offset, va, n, buf);
case Qdrivers:
- p = malloc(READSTR);
- if(p == nil)
- error(Enomem);
- l = 0;
- for(i = 0; devtab[i] != nil; i++)
- 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;
+ return devtabread(c, buf, n, offset);
case Qmemory:
return poolread(va, n, offset);
@@ -490,16 +468,6 @@ conswrite(Chan *c, void *va, long n, vlong offset)
case Qnull:
break;
- case Qpin:
- if(up->env->pgrp->pin != Nopin)
- error("pin already set");
- if(n >= sizeof(buf))
- n = sizeof(buf)-1;
- strncpy(buf, va, n);
- buf[n] = '\0';
- up->env->pgrp->pin = atoi(buf);
- break;
-
case Qtime:
if(n >= sizeof(buf))
n = sizeof(buf)-1;
@@ -611,7 +579,9 @@ Dev consdevtab = {
'c',
"cons",
+ devreset,
consinit,
+ devshutdown,
consattach,
conswalk,
consstat,
diff --git a/emu/port/devtinyfs.c b/emu/port/devtinyfs.c
index 33689745..8445ad6a 100644
--- a/emu/port/devtinyfs.c
+++ b/emu/port/devtinyfs.c
@@ -185,7 +185,7 @@ readdata(Tfs *fs, ulong bno, uchar *buf, int *lenp)
{
if(bno >= fs->nblocks)
return 0;
- if(devtab[fs->c->type]->read(fs->c, buf, Blen, Blen*bno) != Blen)
+ if(fs->c->dev->read(fs->c, buf, Blen, Blen*bno) != Blen)
error(Eio);
return validdata(fs, buf, lenp);
}
@@ -212,7 +212,7 @@ writedata(Tfs *fs, ulong bno, ulong next, uchar *buf, int len, int last)
memmove(md.data, buf, len);
md.sum = 0 - checksum((uchar*)&md);
- if(devtab[fs->c->type]->write(fs->c, &md, Blen, Blen*bno) != Blen)
+ if(fs->c->dev->write(fs->c, &md, Blen, Blen*bno) != Blen)
error(Eio);
}
@@ -233,7 +233,7 @@ writedir(Tfs *fs, Tfile *f)
PUTS(md->pin, f->pin);
md->sum = 0 - checksum(buf);
- if(devtab[fs->c->type]->write(fs->c, buf, Blen, Blen*f->bno) != Blen)
+ if(fs->c->dev->write(fs->c, buf, Blen, Blen*f->bno) != Blen)
error(Eio);
}
@@ -248,7 +248,7 @@ freeblocks(Tfs *fs, ulong bno, ulong bend)
while(bno != bend && bno != Notabno){
mapclr(fs, bno);
- if(devtab[fs->c->type]->read(fs->c, buf, Blen, Blen*bno) != Blen)
+ if(fs->c->dev->read(fs->c, buf, Blen, Blen*bno) != Blen)
break;
md = validdata(fs, buf, 0);
if(md == 0)
@@ -272,7 +272,7 @@ freefile(Tfs *fs, Tfile *f, ulong bend)
/* change file type to free on medium */
if(f->bno != Notabno){
memset(buf, 0x55, Blen);
- devtab[fs->c->type]->write(fs->c, buf, Blen, Blen*f->bno);
+ fs->c->dev->write(fs->c, buf, Blen, Blen*f->bno);
mapclr(fs, f->bno);
}
@@ -332,7 +332,7 @@ newfile(Tfs *fs, char *name)
rock.f->bno = mapalloc(rock.fs);
rock.f->fbno = Notabno;
rock.f->r = 1;
- rock.f->pin = up->env->pgrp->pin;
+ rock.f->pin = Notapin;
/* write directory block */
if(waserror()){
@@ -364,7 +364,7 @@ tfsinit(Tfs *fs)
Mdir *mdir;
Mdata *mdata;
- n = devtab[fs->c->type]->stat(fs->c, dbuf, sizeof(dbuf));
+ n = fs->c->dev->stat(fs->c, dbuf, sizeof(dbuf));
n = convM2D(dbuf, n, &d, nil);
if(n <= 0)
error("cannot stat tinyfs medium");
@@ -382,7 +382,7 @@ tfsinit(Tfs *fs)
/* find files */
for(bno = 0; bno < fs->nblocks; bno++){
- n = devtab[fs->c->type]->read(fs->c, buf, Blen, Blen*bno);
+ n = fs->c->dev->read(fs->c, buf, Blen, Blen*bno);
if(n != Blen)
break;
@@ -412,7 +412,7 @@ tfsinit(Tfs *fs)
freefile(fs, f, bno);
break;
}
- n = devtab[fs->c->type]->read(fs->c, buf, Blen, Blen*bno);
+ n = fs->c->dev->read(fs->c, buf, Blen, Blen*bno);
if(n != Blen){
freefile(fs, f, bno);
break;
@@ -453,7 +453,7 @@ tinyfsgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
USED(ntab);
USED(tab);
- fs = &tinyfs.fs[c->dev];
+ fs = &tinyfs.fs[c->devno];
if(i >= fs->nf)
return -1;
qid.vers = 0;
@@ -525,7 +525,7 @@ tinyfsattach(char *spec)
poperror();
c = devattach('F', spec);
- c->dev = fs - tinyfs.fs;
+ c->devno = fs - tinyfs.fs;
c->qid.type = QTDIR;
c->qid.vers = 0;
@@ -538,12 +538,12 @@ tinyfswalk(Chan *c, Chan *nc, char **name, int nname)
Tfs *fs;
Walkqid *wq;
- fs = &tinyfs.fs[c->dev];
+ fs = &tinyfs.fs[c->devno];
qlock(&fs->ql);
wq = devwalk(c, nc, name, nname, 0, 0, tinyfsgen);
if(wq != nil && (nc = wq->clone) != nil && nc->qid.path != Qdir){
- fs = &tinyfs.fs[nc->dev];
+ fs = &tinyfs.fs[nc->devno];
fs->f[nc->qid.path-1].r++;
}
qunlock(&fs->ql);
@@ -562,7 +562,7 @@ tinyfsopen(Chan *c, int omode)
Tfile *f;
volatile struct { Tfs *fs; } rock;
- rock.fs = &tinyfs.fs[c->dev];
+ rock.fs = &tinyfs.fs[c->devno];
if(c->qid.type & QTDIR){
if(omode != OREAD)
@@ -600,7 +600,7 @@ tinyfscreate(Chan *c, char *name, int omode, ulong perm)
USED(perm);
- rock.fs = &tinyfs.fs[c->dev];
+ rock.fs = &tinyfs.fs[c->devno];
qlock(&rock.fs->ql);
if(waserror()){
@@ -625,7 +625,7 @@ tinyfsremove(Chan *c)
if(c->qid.path == Qdir)
error(Eperm);
- fs = &tinyfs.fs[c->dev];
+ fs = &tinyfs.fs[c->devno];
f = &fs->f[c->qid.path-1];
qlock(&fs->ql);
freefile(fs, f, Notabno);
@@ -639,7 +639,7 @@ tinyfsclose(Chan *c)
Tfile *f, *nf;
int i;
- rock.fs = &tinyfs.fs[c->dev];
+ rock.fs = &tinyfs.fs[c->devno];
qlock(&rock.fs->ql);
@@ -703,7 +703,7 @@ tinyfsread(Chan *c, void *a, long n, vlong offset)
return devdirread(c, a, n, 0, 0, tinyfsgen);
p = a;
- rock.fs = &tinyfs.fs[c->dev];
+ rock.fs = &tinyfs.fs[c->devno];
f = &rock.fs->f[c->qid.path-1];
if(offset >= f->length)
return 0;
@@ -783,7 +783,7 @@ tinyfswrite(Chan *c, void *a, long n, vlong offset)
return 0;
p = a;
- rock.fs = &tinyfs.fs[c->dev];
+ rock.fs = &tinyfs.fs[c->devno];
f = &rock.fs->f[c->qid.path-1];
qlock(&rock.fs->ql);
@@ -879,7 +879,9 @@ Dev tinyfsdevtab = {
'F',
"tinyfs",
+ devreset,
devinit,
+ devshutdown,
tinyfsattach,
tinyfswalk,
tinyfsstat,
diff --git a/emu/port/inferno.c b/emu/port/inferno.c
index b568f9fa..eddacd20 100644
--- a/emu/port/inferno.c
+++ b/emu/port/inferno.c
@@ -859,7 +859,6 @@ Sys_pctl(void *fp)
np.np->slash = cclone(dot);
cnameclose(np.np->slash->name);
np.np->slash->name = newcname("/");
- np.np->pin = o->pgrp->pin; /* pin is ALWAYS inherited */
np.np->nodevs = o->pgrp->nodevs;
opg = o->pgrp;
o->pgrp = np.np;
diff --git a/emu/port/pgrp.c b/emu/port/pgrp.c
index b3d473f3..55fa6c01 100644
--- a/emu/port/pgrp.c
+++ b/emu/port/pgrp.c
@@ -15,7 +15,6 @@ newpgrp(void)
error(Enomem);
p->r.ref = 1;
p->pgrpid = incref(&pgrpid);
- p->pin = Nopin;
p->progmode = 0644;
p->privatemem = 0;
return p;
@@ -44,8 +43,8 @@ closepgrp(Pgrp *p)
}
}
wunlock(&p->ns);
- cclose(p->slash);
cclose(p->dot);
+ cclose(p->slash);
free(p);
}
@@ -81,18 +80,23 @@ pgrpcpy(Pgrp *to, Pgrp *from)
Mhead *f, **tom, **l, *mh;
wlock(&from->ns);
+ if(waserror()){
+ wunlock(&from->ns);
+ nexterror();
+ }
order = 0;
tom = to->mnthash;
for(i = 0; i < MNTHASH; i++) {
l = tom++;
for(f = from->mnthash[i]; f; f = f->hash) {
rlock(&f->lock);
- mh = malloc(sizeof(Mhead));
- if(mh == nil) {
+ if(waserror()){
runlock(&f->lock);
- wunlock(&from->ns);
- error(Enomem);
+ nexterror();
}
+ mh = malloc(sizeof(Mhead));
+ if(mh == nil)
+ error(Enomem);
mh->from = f->from;
mh->r.ref = 1;
incref(&mh->from->r);
@@ -101,16 +105,12 @@ pgrpcpy(Pgrp *to, Pgrp *from)
link = &mh->mount;
for(m = f->mount; m; m = m->next) {
n = newmount(mh, m->to, m->mflag, m->spec);
- if(n == nil) {
- runlock(&f->lock);
- wunlock(&from->ns);
- error(Enomem);
- }
m->copy = n;
pgrpinsert(&order, m);
*link = n;
link = &n->next;
}
+ poperror();
runlock(&f->lock);
}
}
@@ -122,11 +122,11 @@ pgrpcpy(Pgrp *to, Pgrp *from)
m->copy->mountid = mountid.ref++;
unlock(&mountid.lk);
- to->pin = from->pin;
-
+ to->progmode = from->progmode;
to->slash = cclone(from->slash);
to->dot = cclone(from->dot);
to->nodevs = from->nodevs;
+ poperror();
wunlock(&from->ns);
}