From 2a7904a598c5731cb1b4f15c7737fcb39e2c0d92 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 24 Sep 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-09-24 --- alphapc/trap.c | 6 +++++- bitsy/devsac.c | 2 +- bitsy/trap.c | 5 ++++- boot/key.c | 5 +---- ip/inferno.c | 2 +- mtx/trap.c | 5 ++++- pc/trap.c | 5 ++++- port/chan.c | 20 ++++++++++++++------ port/dev.c | 2 +- port/devmnt.c | 2 +- port/devsd.c | 2 +- port/fault.c | 4 ++-- port/portdat.h | 6 ++++-- port/proc.c | 8 +++++--- port/sysproc.c | 8 ++++---- 15 files changed, 52 insertions(+), 30 deletions(-) diff --git a/alphapc/trap.c b/alphapc/trap.c index 9e051edb8d156a52b9360b169ca7ce7dd08fb65a..6f52650258368d66066fc836c1dbb59644023e3b 100644 --- a/alphapc/trap.c +++ b/alphapc/trap.c @@ -651,6 +651,7 @@ print("unknown noted arg 0x%lux\n", arg0); long syscall(Ureg *aur) { + char *e; long ret; ulong sp; Ureg *ur; @@ -704,7 +705,10 @@ print("bad sys call %d pc %lux\n", up->scallnr, (ulong)ur->pc); error: /* failure: save the error buffer for errstr */ - kstrcpy(up->syserror, up->error, sizeof up->syserror); + e = up->syserrstr; + up->syserrstr = up->errstr; + up->errstr = e; + up->nerrlab = 0; up->psstate = 0; up->insyscall = 0; diff --git a/bitsy/devsac.c b/bitsy/devsac.c index 4edd5d36701d51f558e772c6535d7d4daf398633..5109cdd6a9e6b5cd20491e9803f40f0dc1f5d004 100644 --- a/bitsy/devsac.c +++ b/bitsy/devsac.c @@ -231,7 +231,7 @@ sacwalk(Chan *c, Chan *nc, char **name, int nname) if(sac == nil) { if(j == 0) error(Enonexist); - strncpy(up->error, Enonexist, ERRMAX); + kstrcpy(up->errstr, Enonexist, ERRMAX); break; } pathtoqid(getl(sac->qid), &nc->qid); diff --git a/bitsy/trap.c b/bitsy/trap.c index 0b3d22309d25075c7d9fb91409c14a339b530d21..3f09c5fa3d188474d81827c51e9b5d796875b1c7 100644 --- a/bitsy/trap.c +++ b/bitsy/trap.c @@ -426,6 +426,7 @@ gpiointr(Ureg *ur, void*) void syscall(Ureg* ureg) { + char *e; ulong sp; long ret; int i, scallnr; @@ -464,7 +465,9 @@ syscall(Ureg* ureg) poperror(); }else{ /* failure: save the error buffer for errstr */ - kstrcpy(up->syserror, up->error, sizeof up->syserror); + e = up->syserrstr; + up->syserrstr = up->errstr; + up->errstr = e; } if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); diff --git a/boot/key.c b/boot/key.c index 1593ac919dddca690ae3ff42ff21b9c1ba1e8f1f..764b9d24e1137ed267e365e3ccb81c1e8f015121 100644 --- a/boot/key.c +++ b/boot/key.c @@ -77,10 +77,7 @@ key(int islocal, Method *mp) warning("can't read nvram"); } check(safe->machkey, DESKEYLEN, safe->machsum, "bad nvram key"); -#define NAMELEN 28 -/*BUG: THIS IS TOTALLY BOGUS */ - check(safe->authid, NAMELEN, safe->authidsum, "bad authentication id"); -#undef NAMELEN + check(safe->authid, ANAMELEN, safe->authidsum, "bad authentication id"); check(safe->authdom, DOMLEN, safe->authdomsum, "bad authentication domain"); if(kflag){ do diff --git a/ip/inferno.c b/ip/inferno.c index 211b745038adc524e342308880265be337df7d0d..28173c4f98da9233d4a6fe2b10b82ffa5b046de5 100644 --- a/ip/inferno.c +++ b/ip/inferno.c @@ -25,7 +25,7 @@ commonfdtochan(int fd, int mode, int a, int b) char* commonerror(void) { - return up->error; + return up->errstr; } char* diff --git a/mtx/trap.c b/mtx/trap.c index 6cd588ff90d332129a4023d95e99425ba011a9d4..02cbb377afd30198f1a04a3a95365b697821d05d 100644 --- a/mtx/trap.c +++ b/mtx/trap.c @@ -618,6 +618,7 @@ dbgpc(Proc *p) void syscall(Ureg* ureg) { + char *e; ulong sp; long ret; int i, scallnr; @@ -655,7 +656,9 @@ syscall(Ureg* ureg) poperror(); }else{ /* failure: save the error buffer for errstr */ - kstrcpy(up->syserror, up->error, sizeof up->syserror); + e = up->syserrstr; + up->syserrstr = up->errstr; + up->errstr = e; } if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); diff --git a/pc/trap.c b/pc/trap.c index 546d5a6ad5c30847c7f1447c4b6835da5e39af5f..14aa28d4708097ec70752f7f2ca96fabdc92bf7f 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -494,6 +494,7 @@ if(up == nil) {print("what? up is zero pc %8lux\n", ureg->pc); for(;;);} void syscall(Ureg* ureg) { + char *e; ulong sp; long ret; int i, scallnr; @@ -535,7 +536,9 @@ syscall(Ureg* ureg) poperror(); }else{ /* failure: save the error buffer for errstr */ - kstrcpy(up->syserror, up->error, sizeof up->syserror); + e = up->syserrstr; + up->syserrstr = up->errstr; + up->errstr = e; } if(up->nerrlab){ print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); diff --git a/port/chan.c b/port/chan.c index 40c699ae51ad6166943adbdf64ecffe51bf24de7..996f1b1d9bd9567d66fc38e6bf20f67969a340a5 100644 --- a/port/chan.c +++ b/port/chan.c @@ -776,6 +776,9 @@ walk(Chan **cp, char **names, int nnames, int nomount) runlock(&mh->lock); nexterror(); } + /* + * mh->mount == c, so start at mh->mount->next + */ for(f = mh->mount->next; f; f = f->next) if((wq = devtab[f->to->type]->walk(f->to, nil, names, ntry)) != nil) break; @@ -974,7 +977,7 @@ namec(char *aname, int amode, int omode, ulong perm) Elemlist e; Rune r; Mhead *m; - char createerr[ERRMAX]; + char *createerr, tmperrbuf[ERRMAX]; char *name; name = aname; @@ -1039,11 +1042,11 @@ namec(char *aname, int amode, int omode, ulong perm) e.name = nil; e.elems = nil; if(waserror()){ - if(strcmp(up->error, Enonexist) == 0){ + if(strcmp(up->errstr, Enonexist) == 0){ if(strlen(aname) < ERRMAX/3 || (name=strrchr(aname, '/'))==nil || name==aname) - snprint(up->error, sizeof up->error, "\"%s\" does not exist", aname); + snprint(up->errstr, ERRMAX, "\"%s\" does not exist", aname); else - snprint(up->error, sizeof up->error, "file \"...%s\" does not exist", name); + snprint(up->errstr, ERRMAX, "file \"...%s\" does not exist", name); } cclose(c); free(e.name); @@ -1246,9 +1249,14 @@ if(c->umh != nil){ if(omode & OEXCL) nexterror(); /* save error */ - kstrcpy(createerr, up->error, sizeof createerr); - if(walk(&c, e.elems+e.nelems-1, 1, nomount) < 0) + createerr = up->errstr; + up->errstr = tmperrbuf; + /* note: we depend that walk does not error */ + if(walk(&c, e.elems+e.nelems-1, 1, nomount) < 0){ + up->errstr = createerr; error(createerr); /* report true error */ + } + up->errstr = createerr; omode |= OTRUNC; goto Open; } diff --git a/port/dev.c b/port/dev.c index ba198b74beac604ac39d4258be13a126f35d301c..236aab66bd7e1a6c4e569c5be4b448188be6a457 100644 --- a/port/dev.c +++ b/port/dev.c @@ -175,7 +175,7 @@ devwalk(Chan *c, Chan *nc, char **name, int nname, Dirtab *tab, int ntab, Devgen Notfound: if(j == 0) error(Enonexist); - strncpy(up->error, Enonexist, ERRMAX); + kstrcpy(up->errstr, Enonexist, ERRMAX); goto Done; case 0: continue; diff --git a/port/devmnt.c b/port/devmnt.c index ed91cf6226d0bdd3434eb2039ba0680dadfbdb92..72a86eef6a0f486cbae9f349d4a6a387faba37df 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -776,7 +776,7 @@ mountio(Mnt *m, Mntrpc *r) while(waserror()) { if(m->rip == up) mntgate(m); - if(strcmp(up->error, Eintr) != 0){ + if(strcmp(up->errstr, Eintr) != 0){ mntflushfree(m, r); nexterror(); } diff --git a/port/devsd.c b/port/devsd.c index ad7f14929fe2a027b7f4fae3c524f28c7d64ab2a..4cbade364c959068d87f6f2a7ca2473a04e63da0 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -727,7 +727,7 @@ sdbio(Chan* c, int write, char* a, long len, vlong off) qlock(&unit->ctl); while(waserror()){ /* notification of media change; go around again */ - if(strcmp(up->error, Eio) == 0 && unit->sectors == 0 && nchange++ == 0){ + if(strcmp(up->errstr, Eio) == 0 && unit->sectors == 0 && nchange++ == 0){ sdinitpart(unit); continue; } diff --git a/port/fault.c b/port/fault.c index 1a4dd4bd58cfe29d10230d28e05af33dd6c11ae7..787aeed4bb27442af9286fa2621e5014bf60e79b 100644 --- a/port/fault.c +++ b/port/fault.c @@ -43,7 +43,7 @@ faulterror(char *s, Chan *c, int freemem) char buf[ERRMAX]; if(c && c->name){ - snprint(buf, sizeof buf, "%s accessing %s: %s", s, c->name->s, up->error); + snprint(buf, sizeof buf, "%s accessing %s: %s", s, c->name->s, up->errstr); s = buf; } if(up->nerrlab) { @@ -219,7 +219,7 @@ retry: if(loadrec == 0) { /* This is demand load */ c = s->image->c; while(waserror()) { - if(strcmp(up->error, Eintr) == 0) + if(strcmp(up->errstr, Eintr) == 0) continue; kunmap(k); putpage(new); diff --git a/port/portdat.h b/port/portdat.h index ad2299cd94a516e0a08d22b549d61937ba395391..bea0f9fe25e9da442c22ee0f5d937baf65b8e53d 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -611,8 +611,10 @@ struct Proc Sargs s; /* address of this is known by db */ int nerrlab; Label errlab[NERR]; - char syserror[ERRMAX]; /* last error from a system call */ - char error[ERRMAX]; /* reason we're unwinding the error stack */ + char *syserrstr; /* last error from a system call, errbuf0 or 1 */ + char *errstr; /* reason we're unwinding the error stack, errbuf1 or 0 */ + char errbuf0[ERRMAX]; + char errbuf1[ERRMAX]; char genbuf[128]; /* buffer used e.g. for last name element from namec */ Chan *slash; Chan *dot; diff --git a/port/proc.c b/port/proc.c index 94f468f6c38e3ee40fd4bd6eac636c66c3c4c2a3..a38991be067e86dc7c90f92205c41ac298c23a88 100644 --- a/port/proc.c +++ b/port/proc.c @@ -338,8 +338,10 @@ newproc(void) p->movetime = 0; p->wired = 0; p->ureg = 0; - p->error[0] = '\0'; - p->syserror[0] = '\0'; + p->errstr = p->errbuf0; + p->syserrstr = p->errbuf1; + p->errbuf0[0] = '\0'; + p->errbuf1[0] = '\0'; kstrdup(&p->user, "*nouser"); kstrdup(&p->text, "*notext"); kstrdup(&p->args, ""); @@ -1109,7 +1111,7 @@ void error(char *err) { spllo(); - kstrcpy(up->error, err, sizeof up->error); + kstrcpy(up->errstr, err, ERRMAX); nexterror(); } diff --git a/port/sysproc.c b/port/sysproc.c index 3fd34e24066e0f425fe13996b6978d838c728b82..ff1d28e876f817dfd13b0983094f69d0e62cf281 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -629,14 +629,14 @@ werrstr(char *fmt, ...) return; va_start(va, fmt); - doprint(up->error, up->error+ERRMAX, fmt, va); + doprint(up->syserrstr, up->syserrstr+ERRMAX, fmt, va); va_end(va); } static long generrstr(char *buf, uint nbuf) { - char tmp[sizeof up->syserror]; + char tmp[ERRMAX]; validaddr((ulong)buf, nbuf, 1); if(nbuf > sizeof tmp) @@ -644,9 +644,9 @@ generrstr(char *buf, uint nbuf) memmove(tmp, buf, nbuf); /* make sure it's NUL-terminated */ tmp[nbuf-1] = '\0'; - memmove(buf, up->syserror, nbuf); + memmove(buf, up->syserrstr, nbuf); buf[nbuf-1] = '\0'; - memmove(up->syserror, tmp, nbuf); + memmove(up->syserrstr, tmp, nbuf); return 0; }